Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在对象初始化期间调用析构函数?_C++ - Fatal编程技术网

C++ 在对象初始化期间调用析构函数?

C++ 在对象初始化期间调用析构函数?,c++,C++,鉴于下面的代码,为什么我会得到一个关于A的析构函数是私有的错误?显然它是私有的,但我不明白为什么以这种方式初始化B的对象实例会导致调用A的析构函数 很抱歉有任何错误,我正在从非网络系统的内存中重新创建代码,并且没有编译器 class A { public: A(int val) : x(val) {} private: int x; ~A() {} }; class B { public: B() : a

鉴于下面的代码,为什么我会得到一个关于A的析构函数是私有的错误?显然它是私有的,但我不明白为什么以这种方式初始化B的对象实例会导致调用A的析构函数

很抱歉有任何错误,我正在从非网络系统的内存中重新创建代码,并且没有编译器

class A
{
    public:
        A(int val) : x(val) {}

    private:
        int x;
        ~A() {}
};

class B
{
    public:
        B() : aInstance() {}

    private:
        A aInstance;
};

int main()
{
    B b;
}

由于
B
类包含
A
类的实例(作为私有字段
aInstance
),因此当
B
的实例被销毁时,必须将其销毁

这正是
main
中发生的事情。As
B ,当B超出范围时,B应该如何解除A类型的成员?


它不能,因为您已声明析构函数为private。

原因是
A
B
的成员。类型
B
的默认生成构造函数必须为其每个字段的规则调用析构函数。因此这里有一个对
A
析构函数的隐式调用,它无权访问该析构函数,您会得到错误

初始化本身并不涉及使用dtor,但是
B
的实例在
main
的末尾被销毁。
B
包含一个
A
,因此当
B
被销毁时,
A
也必须被销毁——但是
A
的dtor不可用,因此无法生成执行该操作的代码。

我怀疑
A
的析构函数是从构造函数中调用的。
A
的析构函数可能在
b
超出main的作用域时(当程序终止时)被调用。

实际上是b需要访问析构函数,而不是main()

如果你让B成为a的朋友,那就行了。如果您使
main()
成为某个应用程序的朋友,它将不会编译


因为A的实例被声明为“自动”,即它是类成员,所以它的删除不会发生在B的析构函数中,而是发生在B的销毁过程中。然而,这被认为是在B作为类的访问范围内。

不能对基于堆栈的对象进行访问(即使是间接的)。这里有一个关于私有析构函数用法和限制的很好的讨论:存在问题的不是main,而是B,在其中,编译器将自动创建需要删除的析构函数,但它无权访问的析构函数。