c ++指针在函数内删除

时间:2017-08-16 20:06:53

标签: c++ pointers memory-leaks

我知道如果我在头文件中创建一个指针,我应该在调用析构函数时删除它,但是如果我在函数内部创建一个指针呢?我知道在块结束时基本变量会被破坏,指针是否相同?

例如:

Class::Function()
{
    int i = 3; // This gets destroyed after the function ends
    int* j = 5; // What about this? Do I have to delete it somewhere to keep from a leak?
}

如果我在构造函数中初始化j,我会说delete j;以防止泄漏等。在这种情况下我应该做些什么吗?

2 个答案:

答案 0 :(得分:2)

int值分配给指针

int* j = 5;

是非法的,因为您要将int存储到int*。无论如何你可以施展它

int* j = reinterpret_cast<int*>( 5 );

取消引用此指针会导致undefined behavior,因为您不知道该指针指向何处。

你应该初始化那样的指针

int* j = nullptr;

c++11开始,您无法创建nullptr_t的实例并将其分配。

nullptr_t initPointer;
int* j = initPointer;

如果您不使用new运算符为指针分配内存,则不能delete此指针,它将导致undefined behavior。否则,如果您使用new,则需要匹配delete,否则您将获得memory leak。如果要检查程序是否有内存泄漏,请检查此thread并选择一个工具。我可以推荐valgrind

答案 1 :(得分:0)

每次拨打new都需要拨打delete。如果newdelete更多,则会导致内存泄漏。如果相反,则得到double deletes。在您的情况下,如果您从未致电new,则无需删除!

有一些工具可以帮助您匹配新的和删除。我个人最喜欢的是cppcheck。它超级快速且易于使用,并且它运行在c ++源代码上!它通常可以很好地捕获无与伦比的新呼叫和删除呼叫。