如果我这样做:
// (1.)
int* p = new int;
//...do something
delete p;
// (2.)
class sample
{
public:
sample(){}
~sample(){}
};
sample* pObj = new sample;
//...do something
delete pObj;
那C++编译器怎么知道delete
后面的对象是内置数据类型还是类对象呢?
我的另一个问题是,如果我 new
一个指向 int
数组的指针,然后我 delete []
那么如何编译器知道要取消分配的内存块的大小吗?
最佳答案
编译器知道指向对象的类型,因为它知道指针的类型:
p
是一个int*
,因此指向的对象将是一个int
。pObj
是一个sample*
,因此指向的对象将是一个sample
。
编译器不知道您的
int* p
是指向单个int
对象还是数组(int[N]
).这就是为什么您 必须记住对数组使用delete[]
而不是delete
。要取消分配的内存块的大小,最重要的是,要销毁的对象的数量是已知的,因为
new[]
将它们存储在某个地方,而delete[]
知道在哪里检索这些值。 This question from C++ FAQ Lite展示了实现new[]
和delete[]
的两种常用技术。
关于c++ - delete 如何区分内置数据类型和用户定义的数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2347823/