按值返回对象?

时间:2012-09-18 12:30:54

标签: c++ oop return-value

我试图从函数

返回一个本地对象

我有这个问题

如果我返回本地创建的对象,则返回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 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

在第一种情况下,你通过值传递,隐式使用(默认)构造函数(如果你没有定义它,DString::DString(char*)。在第二种情况下,你明确地调用构造函数,但是推荐一个不同的构造函数(也许DString::DString(char const *),取决于dstNewData.ToCharArray()的常量。)另外请查看Return Value Optimization (wikipedia)和Scott Meyers Effective C ++第21项(最后),因为它可能会增加额外的混乱优化。定义(并告诉我们)你的构造函数,行为应该更加可控。

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

答案 2 :(得分:0)

一些评论: 1)你要复制到cstrNewString的字符串有多大?你怎么知道它们适合cstrNewString?

2)首选strncpy()到strcpy() - 使用strcpy,你可以超过数组的大小。

3)为什么在以后删除几行时使用new?我会将它分配到堆栈,在那里免费解除分配。 (字符串会更好)

4)cstrNewString [nSize] - >你怎么知道null被放在字符串的末尾?两者之间是否存在差距?

答案 3 :(得分:0)

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

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