gpt4 book ai didi

c++ - 父持有指向子数据成员的指针并在析构函数中使用数据成员函数

转载 作者:行者123 更新时间:2023-11-28 00:10:51 24 4
gpt4 key购买 nike

我相信我发现了现有代码的错误,但它确实有效。能否帮忙验证一下我的理解是否正确?

它是关于一个父类持有一个对象指针,该指针指向其子类的数据对象。在它的(父)析构函数中,它使用对象指针进行函数访问。我相信当父析构函数被调用时, child 已经被破坏所以父指针指向的对象不再有效。我在下面举个例子:

我对下面代码的问题是父析构函数是否正确?

#include <iostream>
#include <string>
using namespace std;

class object {
public:

object(string na):name(na){}

string get_name(){
return name;
}

private:
string name;
};

class parent {

public:

~parent(){
cout<<"hello"<<endl;
cout<<mp->get_name(); **//!!!! (is this correct use mp here?)**
}
protected:
object* mp;

};


class child:public parent {

public:

child():m("hello"){
parent::mp=&m;
}


private:
object m;
};

int main()
{

child a;

return 0;
}

最佳答案

I belive when the parent destructor is called, the child has already been destructed

§ 12.4.8 将成为我最喜欢的标准引述。

After executing the body of the destructor and destroying any automatic objects allocated within the body, a destructor for class X calls the destructors for X's direct non-variant non-static data members(...)

成员的析构函数在类 dtor 的主体之后执行,因此调用成员的成员函数是安全的。

据说...

在您的情况下,虽然 mp 完全有效,但它指向的值却不是。由于 parent 析构函数在 child 析构函数之后运行,因此拥有者的 child 的值也会被销毁,从而给 parent 留下悬空指针。

关于c++ - 父持有指向子数据成员的指针并在析构函数中使用数据成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33210342/

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