【发布时间】:2012-04-19 14:25:24
【问题描述】:
我想测试当函数的返回值为对象时 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;
}
【问题讨论】:
-
可能重复 [Debug Assertion Failed ... _BLOCK_TYPE_IS_VALID (pHead ](stackoverflow.com/questions/1102123/…)
-
问题是当你返回值时,它会复制对象中的指针。然后两个副本都被销毁,但它们都指向同一个内存块。当第二个被销毁时,它会尝试重新删除同一块内存,这是不允许的。
-
我找到了一个不错的page,它解释了如何在 C++ 中返回对象