复制构造函数演示(崩溃...)

AKN*_*AKN 0 c++ copy-constructor

这是程序......

class CopyCon
{
public:
char *name;

CopyCon()
{ 
    name = new char; 
}

CopyCon(const CopyCon &objCopyCon)
{
    name = new char;
    _tcscpy(name,objCopyCon.name);
}

~CopyCon()
{
    if( name != NULL )
    {
        delete name;
        name = NULL;
    }
}
};

int main()
{
    CopyCon objCopyCon1;
    objCopyCon1.name = "Hai";
    CopyCon objCopyCon2(objCopyCon1);
    objCopyCon1.name = "Hello";
    cout<<objCopyCon2.name<<endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

一旦代码执行完成,当析构函数调用时,它会在'delete'上崩溃说...

调试错误!

计划:......

HEAP CORRUPTION DETECTED:在正常块(#124)之后的0x00366990.CRT检测到应用程序在堆缓冲区结束后写入内存.

(按"重试"调试应用程序)

我们不必在析构函数中清除堆内存.这个程序有什么问题?请帮忙!复制构造函数按预期完美地工作.但还是......!?

Nat*_*man 5

问题是你只char在复制构造函数中分配一个.

main您分配一个4字节的字符串(记住空值),但是当您复制对象时,您只为1个字节分配足够的空间.

你可能想做的就是改变

name = new char;
Run Code Online (Sandbox Code Playgroud)

name = new char[tcslen(objCopyCon.name) + 1];
Run Code Online (Sandbox Code Playgroud)

在析构函数中:

delete name;
Run Code Online (Sandbox Code Playgroud)

delete [] name;
Run Code Online (Sandbox Code Playgroud)

也:

您要分配"Hai""Hello"objCopyCon1.name这是隐藏在构造函数中分配的内存.这个记忆永远不会被释放!

  • 它应该是strlen + 1 (2认同)