C++ 删除类对象数组?
几乎众所周知,下面的代码正确地释放了100个整数的内存C++ 删除类对象数组?,c++,memory-management,new-operator,C++,Memory Management,New Operator,几乎众所周知,下面的代码正确地释放了100个整数的内存 int* ip = new int[100]; delete [] ip; 我认为即使对于用户定义的类,它也可以工作: Node* ip = new Node[100]; delete [] ip; 在第一种情况下,要释放的内存大小(400字节)是在编译时确定的吗?基本上,内部发生了什么 在第二种情况下,会对100个对象中的每个对象调用节点的析构函数吗 基本上,我一直在使用这种语法,但从未理解内部发生的事情,现在我很好奇 不会。内存
int* ip = new int[100];
delete [] ip;
我认为即使对于用户定义的类,它也可以工作:
Node* ip = new Node[100];
delete [] ip;
节点的析构函数吗
structfoo{
~Foo(){std::cout>n;
Foo*a=新的Foo[n];
删除[]a;
在任何编译的C++程序中,内存分配器是一个单独的进程/线程/模块?谁在调用B时调用析构函数?还是编译代码有调用析构函数的指令?谢谢!内存分配器是C++标准库的一部分。<代码>新< /COD>和<代码> DELL[ ]
语句通常编译为对函数的调用,这些函数包装malloc
和free
或操作系统级接口。析构函数也由内存分配器调用(毕竟它只是一个函数).哦,好的。现在有意义了。令人惊讶的是,我这么长时间以来一直在使用语法,假设它神奇地工作,却没有考虑它。因此,如果我动态地去分配一个“N”类对象数组,在库的去分配函数中,会对每个对象调用析构函数……听起来不错:)我会说析构函数更简单kely将由编译器注入的代码调用,而不是作为语言支持库的一部分由内存分配器调用。不过,在正常使用中,请使用std::vector
。
size_t n;
std::cin >> n;
a = new int[n];
// do something interesting
delete[] a;
struct Foo {
~Foo() { std::cout << "Goodbye, cruel world.\n"; }
};
// in main
size_t n;
std::cin >> n;
Foo *a = new Foo[n];
delete[] a;