我对粘贴的代码有疑问。 我为int分配了内存并删除了(像往常一样)。 但在某处,我看到这个sysntax(第1行)分配了一个匿名的int空间。 如何释放这个空间,这不会导致内存泄漏吗?
main(){
int *p = new int;
new int;
if(p)
delete p;
system("PAUSE");
return 0;
}
答案 0 :(得分:14)
如果您分配内存,并故意选择不指向它,那么您就无法释放它。
C ++为你提供了足够的绳索,让你可以用自己的脚瞄准枪 这不是什么新鲜事。
另一个错误是检查p
的值以查看它是否已成功分配
只有在较旧的编译器上,new
如果失败则返回NULL
。在较新的编译器上,失败的new
将导致抛出std::bad_alloc
异常。
所以在这段代码中,(假设您使用的是过去十年的编译器),您知道:
new
成功,p
有效/非空。 p
无法结束NULL
!
即使p
最终为NULL,在delete
值上调用NULL
也非常安全,并且没有任何问题。
所以你的示例代码很可能是:
int main()
{
int *p = new int; // Will throw exception if fails
new int; // Deliberate Mem Leak
delete p; // No need to check NULL
system("PAUSE"); // Pause to see results (NOTE: this is skipped if an exception is thrown!)
return 0;
}
答案 1 :(得分:0)
嗯,这是C ++,所以unavoidable
是一种(轻微)夸大其词。
您需要的“全部”替换全局operator new
,并跟踪分配。
现在:我无法想象这样做是真正的代码,但仅仅是类类型的等效是在实践中完成的事情(虽然我并不暗示它是最好的练习!)
例如,这个(否则非常愚蠢)代码不会泄漏。
int count = 0;
void* operator new (size_t size)throw(std::bad_alloc)
{
if (size == sizeof(int))
{
++count;
if (count == 2)
return &count;
}
return malloc (size);
}
void operator delete (void *p)throw()
{
if (p != &count)
free(p);
}
int main()
{
int *p = new int;
new int;
delete p;
system("PAUSE");
return 0;
}