-1

我试图从一个函数返回一个本地对象

我有这个问题

如果我返回本地创建的对象,它返回 null

DString DString :: operator + (const char* param)
{
    // Variable definition
    int nSize = ( this->GetLength() + (strlen(param)));
// Create a new char array in the opropriate size
char* cstrNewString = new char[nSize + 1];

// Append data
strcpy(cstrNewString, this->_cstrString);
strcat(cstrNewString, (char*)param);
cstrNewString[nSize] = '\0';

// Create a new DString to return
DString dstNewData(cstrNewString);

// Clean up
delete[] cstrNewString;

// Return data
return (dstNewData); // Null!

如果我做同样的事情只在返回行中创建一个新对象,例如:

DString DString :: operator + (const char* param)
{
    // Variable definition


int nSize = ( this->GetLength() + (strlen(param)));

// Create a new char array in the opropriate size
char* cstrNewString = new char[nSize + 1];

// Append data
strcpy(cstrNewString, this->_cstrString);
strcat(cstrNewString, (char*)param);
cstrNewString[nSize] = '\0';

// Create a new DString to return
DString dstNewData(cstrNewString);

// Clean up
delete[] cstrNewString;

// Return data
return (DString(dstNewData.ToCharArray())); // Not null, returns correctly!

它正确返回..为什么要这样做,我该如何解决?

4

4 回答 4

3

您的复制构造函数是如何定义的?在第一种情况下,调用了复制构造函数;在第二个没有。您没有向我们展示 的任何基本代码DString,但考虑到明显的语义,几乎可以肯定编译器生成的复制构造函数不会 做正确的事情。如果您DString包含在析构函数中删除的动态分配的指针(我看不出它会如何),则复制构造函数必须进行深层复制。

于 2012-09-18T13:16:36.917 回答
1

在第一种情况下,您通过值传递,隐式使用(默认)构造函数(如果您没有定义它,DString::DString(char*)。在第二种情况下,您显式调用构造函数,但可能是一个不同的构造函数(也许DString::DString(char const *),取决于dstNewData.ToCharArray()的常量) . 另外请看一下Return Value Optimization (wikipedia)和 Scott Meyers Effective C++ item 21 (at the end), 因为它可能会由于优化而增加额外的混乱。定义(并向我们展示)你的构造函数和行为应该更多受控。

这是一个疯狂的猜测,没有真正看到你的构造函数。

于 2012-09-18T12:46:29.957 回答
0

几点评论: 1) 您复制到 cstrNewString 的字符串有多大,您如何知道它们适合 cstrNewString?

2) 优先使用 strncpy() 而不是 strcpy() -- 使用 strcpy,可以超过数组的大小。

3)当你在几行之后删除它时,你为什么要使用 new ?我会将它分配在免费释放的堆栈上。(字符串会更好)

4) cstrNewString[nSize] --> 你怎么知道 null 被放在了字符串的末尾?中间有空隙吗?

于 2012-09-18T12:47:38.860 回答
0

我认为第一个函数不会返回 NULL,但是当您在返回的对象上调用 ToCharArray() 时它会返回 NULL。

这可能与您可能没有实现 Copy 构造函数有关,您应该将 char 缓冲区从参数对象复制到this对象

于 2012-09-18T12:58:40.877 回答