delete如何区分内置数据类型和用户定义数据类型?

Raj*_*pal 6 c++ memory-management new-operator delete-operator

如果我这样做:

// (1.)
int* p = new int;
//...do something
delete p;

// (2.)
class sample
{
public:
sample(){}
~sample(){}
};
sample* pObj = new sample;
//...do something
delete pObj;
Run Code Online (Sandbox Code Playgroud)

那么C++编译器如何知道后面的对象delete是内置数据类型还是类对象?

我的另一个问题是,如果我new指向一个数组的指针int然后我,delete []那么编译器如何知道要取消分配的内存块的大小?

Dan*_*nga 4

  1. 编译器知道所指向对象的类型,因为它知道指针的类型:

    • p是 an int*,因此指向的对象将是 an int
    • pObj是 a sample*,因此指向的对象将是 a sample
  2. 编译器知道您int* p指向的是单个int对象还是数组 ( int[N])。这就是为什么必须记住使用delete[]而不是deletefor 数组。

    要取消分配的内存块的大小以及最重要的是要销毁的对象的数量都是已知的,因为new[]它们将它们存储在某个地方,并且delete[]知道在哪里检索这些值。C++ FAQ Lite 中的这个问题展示了实现new[]和的两种常见技术delete[]