gpt4 book ai didi

c++ - 使用 protected 析构函数动态分配类数组

转载 作者:IT老高 更新时间:2023-10-28 12:34:50 31 4
gpt4 key购买 nike

如果我定义了一个类

class A {
protected:
~A(){ }
};

然后我可以动态分配单个对象以及对象数组,例如

A* ptr1 = new A;
A* ptr2 = new A[10];

但是当我为这个类定义构造函数时

class A {
public:
A(){}
protected:
~A(){ }
};

然后我可以创建单个对象

A* ptr = new A;

但是当我尝试动态分配对象数组时

A* ptr = new A[10];

编译器(gcc-5.1 和 Visual Studio 2015)开始提示 A::~A() 无法访问。

谁能解释一下:-

1- 为什么定义构造函数和未定义构造函数的行为差异。

2- 定义构造函数时,为什么允许我创建单个对象而不是对象数组。

最佳答案

使用 protected 析构函数拒绝数组-new 是正确的,根据 C++11, §5.3.4 ¶17:

If the new-expression creates an object or an array of objects of class type, access and ambiguity control are done for the allocation function, the deallocation function (12.5), and the constructor (12.1). If the new expression creates an array of objects of class type, access and ambiguity control are done for the destructor (12.4).

(添加了重点;C++03 中使用了几乎完全相同的措辞,§5.3.4 ¶16;C++14 移动了一些东西,但这似乎并没有改变问题的核心 -请参阅@Baum mit Augen 的回答)

这是因为 new[] 仅在所有元素都已构建完成的情况下才会成功,并且希望避免在其中一个构造函数调用失败的情况下泄漏对象;因此,如果它设法构造了前 9 个对象,但第 10 个对象因异常而失败,则它必须在传播异常之前破坏前 9 个对象。

请注意,如果构造函数声明为 noexcept,则逻辑上不需要此限制,但标准似乎在这方面没有任何异常(exception)。


所以,这里的 gcc 在第一种情况下在技术上是错误的,就标准而言,这也应该被拒绝,尽管我认为“道德上” gcc 做了正确的事情(实际上有A 的默认构造函数不可能抛出)。

关于c++ - 使用 protected 析构函数动态分配类数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41779374/

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