删除类对象的数组?

tan*_*non 5 c++ memory-management new-operator

几乎常见的是,下面的代码正确地释放了100个整数的内存.

int* ip = new int[100];
delete [] ip; 
Run Code Online (Sandbox Code Playgroud)

我认为即使对于用户定义的类,它也可以工作:

Node* ip = new Node[100];
delete [] ip; 
Run Code Online (Sandbox Code Playgroud)
  1. 在第一种情况下,是否要释放的内存大小(400字节),在编译时确定?基本上,内部发生了什么?

  2. 在第二种情况下,是否会Node在100个对象中的每一个上调用析构函数?

从本质上讲,我一直在使用这种语法,但从来没有理解内部发生了什么,现在我很好奇.

Fre*_*Foo 7

  1. 不.内存分配器无形地跟踪大小.在编译时无法确定大小,因为这样的分配将不是真正动态的,并且以下方法不起作用:

size_t n;
std::cin >> n;
a = new int[n];
// do something interesting
delete[] a;
Run Code Online (Sandbox Code Playgroud)
  1. 是.为了说服自己这个事实,试试吧

struct Foo {
    ~Foo() { std::cout << "Goodbye, cruel world.\n"; }
};

// in main
size_t n;
std::cin >> n;
Foo *a = new Foo[n];
delete[] a;
Run Code Online (Sandbox Code Playgroud)

  • 我会说,析构函数更可能被编译器注入的代码调用,而不是内存分配器作为语言支持库的一部分. (2认同)