2

我只是不小心写了下面的代码。它是在 linux 环境下使用 gcc 4.4.7 编译的。

int main ()
{
        new int;
        return 0;
}

我很惊讶编译器没有指出任何错误或警告。是否提到了c ++标准?在这种情况下是否仍然可以防止内存泄漏?欢迎任何建议。

4

5 回答 5

1

这没有问题。这在 c++ 中有效。

于 2013-05-03T10:22:43.173 回答
1

这是完全有效的 C++。你为什么对它编译感到惊讶?

于 2013-05-03T10:22:57.567 回答
1

为了防止内存泄漏,您应该使用 shared_ptr 而不是原始指针:

#include <memory>
int main ()
{
        std::shared_ptr<int> i(new int);
        return 0;
}

现在新分配的对象在作用域的末尾被删除。而且您的代码中没有内存泄漏。有关更多详细信息,请查看 C++11动态内存管理的动态内存管理

于 2013-05-03T10:23:44.287 回答
1

这就是为什么您应该在新代码中尽量避免使用原始“新”的原因之一。std::make_shared 和 c++14 中的 std::make_unique 更安全,因为它们将通过返回知道何时以及如何删除对象的 shared_ptr 和 unique_ptr 对象来确保正确删除内存。目的是 raw new 将主要只在实现数据结构的低级代码中需要。

于 2013-05-03T10:28:25.543 回答
0

正如我评论的那样,程序可以“合法地”泄漏内存。

在大多数操作系统(特别是 Posix 或 Linux)上,内核会在进程退出后释放进程使用的所有内存。

因此,如果在初始化期间,程序分配了一些(堆)数据 - 数量有限 - 并且根本不费心释放它,这是一个“合法的”内存泄漏(并且可能真正的程序表现出这种行为:例如 GCC 编译器,或 Firefox 浏览器,或大多数 X11 客户端库等...)。

但是,在程序正常运行期间不断发生的泄漏并增加内存消耗是不受欢迎的。

另外,我相信可以证明内存泄漏的静态分析等同于停机问题,因此无法在编译时始终检测到它:要么您会收到一些错误警报,要么某些泄漏将未被检测到。

在运行时,您可以使用valgrind来追踪内存泄漏。

此外,某些内存区域的活跃度是程序的全局属性。阅读有关垃圾收集的更多信息,或许可以考虑使用Boehm 的保守 GC

于 2013-05-03T10:27:03.723 回答