【问题标题】:c++ pointer deletion inside function [closed]函数内部的c ++指针删除[关闭]
【发布时间】:2018-01-25 02:29:07
【问题描述】:

我知道如果我在头文件中创建一个指针,我应该总是在调用析构函数时删除它,但是如果我在函数内部创建一个指针呢?我知道基本变量在块的末尾会被销毁,指针也一样吗?

例如:

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; 以防止泄漏等。在这种情况下我应该做些什么吗?

【问题讨论】:

  • 如果你没有new它,就不要delete它。
  • 我投了反对票,因为这个问题只表明你没有充分研究指针在 C++ 中的工作原理。所以,把它当作学习更多的动力。
  • 如果你不在堆中分配任何内存你不必担心
  • 它还能编译吗?
  • 在嵌入式系统世界中,我们将硬件设备的地址分配给指针,以便访问设备。在这些情况下,没有分配内存,因此不使用newdelete

标签: c++ pointers memory-leaks


【解决方案1】:

给指针赋值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

【讨论】:

  • 附录:在具有虚拟内存的现代系统上,每个进程都有自己的虚拟地址空间。即使没有为地址分配实际存储空间,指针也将在程序范围内。您不必担心取出内核。如果您出于某种原因没有虚拟内存支持……请大哭一场,释放 frobweeszleqrrrtxzzt
  • 感谢您的指出!我熟悉逻辑到物理地址的转换和分页,我不知道我是从哪里来的:/谢谢。固定。
  • 抱歉,我的观点有误。你最初的措辞很好。它只需要一些扩展来覆盖虚拟内存情况。您所描述的情况仍然发生在许多系统中。
  • 没问题。我认为我不能让它保持原样,它的描述已经足够了。将积分分配给指针是一个非常糟糕的主意。
【解决方案2】:

new 的每次调用都需要对delete 的匹配调用。如果new 的数量多于delete 的数量,则会出现内存泄漏。如果相反,你会得到double deletes。在您的情况下,如果您从未调用过new,则无需删除!

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

【讨论】:

  • 现在这种语言鼓励你避免使用 new。
猜你喜欢
  • 1970-01-01
  • 2013-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-31
  • 2013-10-14
  • 1970-01-01
  • 2021-04-04
相关资源
最近更新 更多