gpt4 book ai didi

c++ - 新的数组分配

转载 作者:行者123 更新时间:2023-12-04 00:30:45 24 4
gpt4 key购买 nike

所以我有这个名为point的类,只是为了在每次构造和销毁对象时登录到控制台。我做了以下事情:

#include <iostream>

struct point{
point() {
std::cout << "ctor\n";
}
~point() {
std::cout << "dtor\n";
}
};
int main(){
int x = 3;
point* ptr = new point[x]{point()};
delete[] ptr;
}
ctor
dtor
dtor
dtor

这最终只调用了一次构造函数,调用了 3 次析构函数,为什么?我知道这很糟糕,可能是 ub,但我想了解原因。其他分配给了我“预期”的输出:

int x = 3;
constexpr int y = 3;
point* ptr1 = new point[3];
point* ptr2 = new point[x];
point* ptr3 = new point[y]{point()};
ctor
ctor
ctor
dtor
dtor
dtor

我使用的是 Visual Studio 19 最新版本。

最佳答案

这是一个编译器错误。

通过使用没有常量定义类型大小的运算符 new,MSVC 编译器将调用类对象构造函数和析构函数,次数与在初始化列表和/或数组大小中明确指定的次数相同。

#include <iostream>

struct point {
point() {
std::cout << "ctor\n";
}
~point() {
std::cout << "dtor\n";
}
};
int main() {
int x = 3;
point* ptr = new point[x]{point()};
delete[] ptr;
}

如上所述将调用明确指定 point一次。

这可以通过以下方式断言: point* ptr = new point[x]{point(), point()};
  • MSVC 输出:ctor ctor dtor dtor dtor .
  • 海湾合作委员会:ctor ctor ctor dtor dtor dtor (应该保证)

  • 甚至一个可抛出的数组越界异常 UB: point* ptr = new point[x]{point(), point(), point(), point(), point() };遵循行为。
  • MSVC 输出:ctor ctor ctor ctor ctor dtor dtor dtor .
  • 海湾合作委员会:terminate called after throwing an instance of 'std::bad_array_new_length'

  • 如果定义的大小是常量,则会正确检测到过多的初始化程序。即 const int x = 3constexpr int x = 3

    关于c++ - 新的数组分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59337181/

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