我只是不小心写了下面的代码。它是在 linux 环境下使用 gcc 4.4.7 编译的。
int main ()
{
new int;
return 0;
}
我很惊讶编译器没有指出任何错误或警告。是否提到了c ++标准?在这种情况下是否仍然可以防止内存泄漏?欢迎任何建议。
我只是不小心写了下面的代码。它是在 linux 环境下使用 gcc 4.4.7 编译的。
int main ()
{
new int;
return 0;
}
我很惊讶编译器没有指出任何错误或警告。是否提到了c ++标准?在这种情况下是否仍然可以防止内存泄漏?欢迎任何建议。
这没有问题。这在 c++ 中有效。
这是完全有效的 C++。你为什么对它编译感到惊讶?
为了防止内存泄漏,您应该使用 shared_ptr 而不是原始指针:
#include <memory>
int main ()
{
std::shared_ptr<int> i(new int);
return 0;
}
现在新分配的对象在作用域的末尾被删除。而且您的代码中没有内存泄漏。有关更多详细信息,请查看 C++11动态内存管理的动态内存管理
这就是为什么您应该在新代码中尽量避免使用原始“新”的原因之一。std::make_shared 和 c++14 中的 std::make_unique 更安全,因为它们将通过返回知道何时以及如何删除对象的 shared_ptr 和 unique_ptr 对象来确保正确删除内存。目的是 raw new 将主要只在实现数据结构的低级代码中需要。
正如我评论的那样,程序可以“合法地”泄漏内存。
在大多数操作系统(特别是 Posix 或 Linux)上,内核会在进程退出后释放进程使用的所有内存。
因此,如果在初始化期间,程序分配了一些(堆)数据 - 数量有限 - 并且根本不费心释放它,这是一个“合法的”内存泄漏(并且可能真正的程序表现出这种行为:例如 GCC 编译器,或 Firefox 浏览器,或大多数 X11 客户端库等...)。
但是,在程序正常运行期间不断发生的泄漏并增加内存消耗是不受欢迎的。
另外,我相信可以证明内存泄漏的静态分析等同于停机问题,因此无法在编译时始终检测到它:要么您会收到一些错误警报,要么某些泄漏将未被检测到。
在运行时,您可以使用valgrind来追踪内存泄漏。
此外,某些内存区域的活跃度是程序的全局属性。阅读有关垃圾收集的更多信息,或许可以考虑使用Boehm 的保守 GC。