c ++新的运营商使用问题

时间:2013-05-03 10:20:02

标签: c++ new-operator

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

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

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

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

现在,在范围的末尾删除了新分配的对象。并且您的代码中没有内存泄漏。有关更多详细信息,请查看C ++ 11 Dynamic Memory management

的动态内存管理

答案 3 :(得分:1)

这就是为什么你应该尽量避免生吃&#34;新&#34;尽可能在新代码中。 std :: make_shared和c ++ 14 std :: make_unique更加安全,因为它们将通过返回知道何时以及如何删除对象的shared_ptr和unique_ptr对象来确保正确删除内存。目的是在实现数据结构的低级代码中通常只需要原始的新内容。

答案 4 :(得分:0)

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

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

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

然而,在程序正常运行期间连续发生的泄漏以​​及增加内存消耗的情况令人不悦。

另外,我相信可以证明内存泄漏的静态分析等同于halting problem所以在编译时无法始终检测到它:要么你得到一些{{3}或者,一些泄漏将不会被发现。

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

此外,某些内存区域的活跃度是程序的全局属性。详细了解valgrind,也许可以考虑使用garbage collection