0

我正在将 HBuf 传递给函数,但它崩溃了我不知道我是否遵循正确的方式

//case 1:

HBufC8* iBuffer2 = HBufC8::NewL(1000 );

TPtr8 bufferPtr( iBuffer2->Des() );

 //assigning value to HBuf code


StartParsingL(iBuffer2);

StartParsingL(HBufC8* aHBufPtr)
{

  iBuffer = HBufC8::NewL(aHBufPtr->Length());//it crashes here
  bufferPtr.Copy(aHBufPtr->Des());//also here
}
4

3 回答 3

1

Not answering your question (as there isn't really enough information). I would recommend using an RBuf instead of a HBuf as they are the recommended heap buffer descriptor going forward, and a bit easier to use.

于 2009-07-29T16:02:40.160 回答
0

在 Symbian 编码约定中,“i”前缀变量是成员变量。

在您的代码段中,您将其作为本地声明。可能是您只是为了代码片段的清晰而输入了类型,但是如果您将其声明为成员变量和本地声明,则可以解释大量崩溃:-)

你应该有:

class C....: public CBase?....
   {
private:
   HBufC8* iBuffer2;
   };

...

void C...::ConstructL()
   {
   ...
   iBuffer2 = HBufC8::NewL(1000);
   ...
   }
于 2009-07-06T06:10:09.697 回答
0

此代码没有直接显示崩溃的原因。请下次发布实际的片段。

此外,在发布有关崩溃的信息时,最好知道它是如何崩溃的。我认为这是 KERN-EXEC 3 恐慌。但请您自己明确说明。

我猜aHBufPtr传递给StartParsingL要么为零,要么不指向有效HBuf8对象。这将是坠机的直接原因。为什么它不是一个有效的指针在代码中不可见,但一个原因可能是用@Will 怀疑的局部变量来隐藏成员变量

进一步的几点,与这里的崩溃无关,但一般来说是 Symbian C++:

  • 在传递描述符时,您应该使用最通用的只读TDesCTDesC8类型引用或读写TDesTDes8类型引用。仅当您将所有权转移给被调用者时才使用HBufC或指针。HBufC8

  • 在这个片段中: bufferPtr.Copy(aHBufPtr->Des()); Copy接受 aTDesC&所以你不需要调用Des: bufferPtr.Copy(*aHBufPtr); 虽然如果你只是想复制一个描述符,你可以使用任何描述符Alloc函数,比如AllocL.

于 2009-07-06T06:33:25.377 回答