gpt4 book ai didi

c++ - 多次调用构造函数会改变C++中的成员指针地址

转载 作者:行者123 更新时间:2023-11-27 23:40:49 25 4
gpt4 key购买 nike

我写了一个程序查看类创建的init过程,发现多次调用构造函数改变了成员指针地址。请看以下代码段。

#include <iostream>
using namespace std;

class FF {
public:
FF(){
this->ptr = NULL;
value = 1;
cout << "ptr address in 1: " << this->ptr <<endl;
}

FF(const int* ptrcopy, const int valuecopy){
cout << "ptr address in 2: " << this->ptr << endl;
FF();
/* Is this equivalent with FF() ?
this->ptr = NULL;
value = 1;
*/
init(ptrcopy, valuecopy);
}

void init(const int* ptrcopy, const int valuecopy) {
cout << "ptr address in 3: " << this->ptr << endl;
if (this->ptr != NULL)
{
cout << "error happened, the address of ptr is " << this->ptr << endl;
return;
}
}

private:
int* ptr;
int value;
};

int main(){
int *ptr = new int(10);
int value = 1;
FF fclass(ptr, value);
delete(ptr);
return 0;
}

输出是

ptr address in 2: 0x400b40
ptr address in 1: 0
ptr address in 3: 0x400b40
error happened, the address of ptr is 0x400b40

FF() 的调用似乎只是将其空间中的ptr 初始化为NULL,调用后ptr 变回原来的0x400b40。

谁能解释一下?

最佳答案

您对 FF(); 的调用将创建一个新的、未命名的基于堆栈的 FF 对象,构造它(生成您看到的输出),然后立即再次销毁它(你没有显示任何输出)。这就是为什么 ptr 地址似乎变回来了——因为它从未改变过。添加一个析构函数,打印出 this 的地址以查看这种情况的发生。

顺便说一句,您在第二个(参数化的)构造函数中使用 this->ptr 是未定义行为,因为您从未为 ptr 赋值。

如果您的意图是从参数化构造函数调用默认构造函数,并且您的编译器支持 C++11,您可以 delegate到默认构造函数。

FF(const int* ptrcopy, const int valuecopy): FF() { /* ... */ }

关于c++ - 多次调用构造函数会改变C++中的成员指针地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55057320/

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