gpt4 book ai didi

c++ - 指针初始化覆盖值

转载 作者:行者123 更新时间:2023-12-01 14:52:47 25 4
gpt4 key购买 nike

狗.h

class Dog
{
public:
int *pVal;
Dog(int);
~Dog();
static int GetVal(Dog d);
};

狗.cpp
Dog::Dog(int val)
{
pVal = new int;
*pVal = val;
}

Dog::~Dog()
{
delete pVal;
}

int Dog::GetVal(Dog d)
{
return *(d.pVal);
}

测试
Dog fido(20);
CHECK(Dog::GetVal(fido) == 20);

Dog rex(21);
CHECK(Dog::GetVal(fido) == 20);
CHECK(Dog::GetVal(rex) == 21);

第一次检查顺利。但是,一旦我声明 Dog rex(21),我的 fido 对象的 pVal 就会被 21 覆盖。通过调试,我注意到在调用 时新整数 在构造函数中 的 pVal雷克斯 获得与 相同的内存地址菲多对象的 pVal。我尝试了很多,但找不到任何东西。

初始化指针并为其赋值的正确方法是什么?

请帮忙。先感谢您。

最佳答案

当您调用此电话时:

Dog::GetVal(fido);

您复制 DogGetVal 的论点中.默认的复制构造函数被调用,它只生成 pVal 的浅拷贝。 .因此,当拷贝超出范围时, pVal 指向的内存被删除,即删除 fido指向的内存.

一种解决方法是采用 Dog&GetVal ,这避免了拷贝。
static int GetVal(Dog &d);

更好的选择是为您的 Dog 提供一个复制构造函数。 , 像这样:
Dog(Dog const & d) 
{
pVal = new int{*(d.pVal)};
}

这是一个有效的 demo .

至于你的观察:

I have noticed that on calling new int in the constructor the pVal of rex gets the same memory address as the fido object's pVal.



如上所述,当您调用 rex 时的构造函数,分配给 fido 的内存已经被释放,所以同样的内存可以用于 rex . (当然,这不保证会发生)。

关于c++ - 指针初始化覆盖值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61669746/

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