gpt4 book ai didi

C++ 对象作为返回值 : copy or reference?

转载 作者:IT王子 更新时间:2023-10-28 23:35:07 25 4
gpt4 key购买 nike

我想测试当函数的返回值为对象时 C++ 的行为。我做了这个小例子来观察分配了多少字节,并确定编译器是复制对象(比如当对象作为参数传递时)还是返回某种引用。

但是,我无法运行这个非常简单的程序,我也不知道为什么。错误说:“调试断言失败!表达式:BLOCK_TYPE_IS_INVALID”在某些 dbgdel.cpp 文件中。 Project 是一个 win32 控制台应用程序。但我很确定这段代码有问题。

class Ctest1
{
public:
Ctest1(void);
~Ctest1(void);

char* classSpace;
};

Ctest1::Ctest1(void)
{
classSpace = new char[100];
}

Ctest1::~Ctest1(void)
{
delete [] classSpace;
}

Ctest1 Function(Ctest1* cPtr){
return *cPtr;
}

int _tmain(int argc, _TCHAR* argv[])
{
Ctest1* cPtr;

cPtr=new Ctest1();


for(int i=1;i<10;i++)
*cPtr = Function(cPtr);


delete cPtr;

return 0;
}

最佳答案

您违反了Rule of Three .

具体来说,当您返回一个对象时,会生成一个拷贝,然后将其销毁。因此,您有一系列事件,例如

Ctest1::Ctest1(void);
Ctest1::Ctest1(const Ctest1&);
Ctest1::~Ctest1();
Ctest1::~Ctest1();

即创建了两个对象:你的原始对象构造,然后是隐式复制构造函数。然后删除这两个对象。

由于这两个对象都包含 same 指针,因此您最终会在同一值上调用两次 delete轰隆隆


额外的功劳:当我调查“我想知道拷贝是如何制作的”之类的问题时,我将打印语句放在有趣的类方法中,如下所示:

#include <iostream>

int serial_source = 0;
class Ctest1
{
#define X(s) (std::cout << s << ": " << serial << "\n")
const int serial;
public:
Ctest1(void) : serial(serial_source++) {
X("Ctest1::Ctest1(void)");
}
~Ctest1(void) {
X("Ctest1::~Ctest1()");
}
Ctest1(const Ctest1& other) : serial(serial_source++) {
X("Ctest1::Ctest1(const Ctest1&)");
std::cout << " Copied from " << other.serial << "\n";
}
void operator=(const Ctest1& other) {
X("operator=");
std::cout << " Assigning from " << other.serial << "\n";
}
#undef X
};

Ctest1 Function(Ctest1* cPtr){
return *cPtr;
}

int main()
{
Ctest1* cPtr;

cPtr=new Ctest1();


for(int i=1;i<10;i++)
*cPtr = Function(cPtr);

delete cPtr;

return 0;
}

关于C++ 对象作为返回值 : copy or reference?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10035513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com