gpt4 book ai didi

c++ - 使用相同的变量复制构造函数 - 按值调用函数两次会导致问题吗?

转载 作者:行者123 更新时间:2023-11-30 00:53:51 25 4
gpt4 key购买 nike

我被指向了以下文章:

http://www.codeproject.com/Tips/78946/C-Copy-Constructor-in-depth

我们有代码:

class string
{
// constructor
string(char* aStr)
{
str = new char[sizeof(aStr)];
strcpy (str,aStr);
}

// destructor
~string()
{
del str;
}

char *getChars(){ return str; }
char* str;
};


void function (string str)
{
// do something
}


void main ()
{
string str("hello");
function(str);
function(str); // program crashes
}

我不明白为什么在main中,第二次调用function会有问题?当然,当 str 被传递到第一次调用时,这只会是 str 的拷贝,因此在 中对 str 所做的任何事情function 不会影响 main 中声明的变量 str?

最佳答案

默认的复制构造函数会逐位复制对象。换句话说,指针成员被复制,而不是它指向的对象。 如果您使用默认构造函数并且仅执行浅拷贝,则两个对象中的指针将指向同一个对象。

针对您的问题:

第一次调用 function(str) 一切正常,当函数结束时,堆栈上的输入参数被销毁(这是 str 的拷贝,但使用默认的复制构造函数,其指针指向与原始对象相同的位置),并且将调用其析构函数删除指针指向的对象。

第二次调用function(str),当函数结束时,析构函数现在会尝试释放str中指针指向的地址,并且崩溃。

为避免此类问题,您应该定义自己的复制构造函数,它不仅可以正确复制对象,还可以执行深复制,而不仅仅是指针。

关于c++ - 使用相同的变量复制构造函数 - 按值调用函数两次会导致问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15349374/

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