gpt4 book ai didi

c++ - 将对象传递给函数、作用域和析构函数

转载 作者:太空宇宙 更新时间:2023-11-04 11:40:49 25 4
gpt4 key购买 nike

最近我重新开始使用 C++ 编程,并且在编程其他东西时遇到了一些有趣的事情。

在下面的代码中,我定义了一个带有指针成员的类,该成员在类的析构函数中被删除。

我还定义了一个将 Test_Object 对象作为参数的函数,该函数调用 get_val() 方法之一,该方法仅报告指针指向的内存地址中保存的值。

现在,当我两次调用该函数时,它会正确打印一次内部指针保存的值,然后在第二次之后进行核心转储。

如果我错了,请纠正我,但我相信发生这种情况的原因是因为在第一次调用函数后,对象的析构函数被调用,因为对象已经超出范围并且基本上被销毁了。

我能想到的防止这种情况的唯一方法是通过引用传递对象。有没有其他方法可以防止这种情况发生?简单地通过引用传递对象似乎有点危险,因为可以在该函数调用中修改对象,这可能会在以后导致头痛。

我试过使参数为 const,但是我收到一条错误消息,指出“const Test_Object”作为“void Test_Object::get_val()”的“this”参数丢弃了限定符 argument.get_val();

#include <iostream>

using namespace std;

class Test_Object
{
private:
int *internal_pointer;
public:
Test_Object(int value)
{
internal_pointer = new int;
*internal_pointer = value;
}
~Test_Object()
{
delete internal_pointer;
internal_pointer = NULL;
}
void get_val() { cout<<*internal_pointer<<endl; }
};

void test_outsider(Test_Object argument)
{
argument.get_val();
}

int main()
{
Test_Object test = Test_Object(4);
test_outsider(test);
test_outsider(test);
return 0;
}

最佳答案

首先,您应该阅读 the rule of three .

至于你的问题,这是因为对象被复制,并且由于你没有提供自己的复制构造函数,指针被“按原样”复制,留下多个拷贝指向相同的分配内存。当其中一个拷贝删除析构函数中分配的内存时,所有拷贝的指针都将失效。

您可以通过实现复制构造函数和复制赋值运算符来解决该问题。

关于c++ - 将对象传递给函数、作用域和析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21484499/

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