C++ 删除类对象数组?

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个对象中的每个对象调用节点的析构函数吗 基本上,我一直在使用这种语法,但从未理解内部发生的事情,现在我很好奇 不会。内存

几乎众所周知,下面的代码正确地释放了100个整数的内存

int* ip = new int[100];
delete [] ip; 
我认为即使对于用户定义的类,它也可以工作:

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

  • 在第二种情况下,会对100个对象中的每个对象调用
    节点的析构函数吗

  • 基本上,我一直在使用这种语法,但从未理解内部发生的事情,现在我很好奇

  • 不会。内存分配器会不可见地跟踪大小。无法在编译时确定大小,因为这样分配将不是真正的动态分配,并且以下操作将不起作用:
  • 对。要让自己相信这一事实,请尝试
  • 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;