2016-04-12 67 views
-4

以下article解释了内存泄漏。我不知道为什么下面的代码导致内存泄漏。为什么这是一个内存泄漏?

int *data = new int; 
    *data = 15; 

当我创建data并指定15,那么像我明白15被复制到记忆data所以我们还是有一个指向data指针,我们可以delete它。

我认为内存泄漏将是data = 0x00123例如,对吧?这里我们已经失去了对内存的控制,而内存真的被浪费了。

有什么想法?

+2

泄漏是如果'delete'从未在数据指向的指针上调用,则复制'15'不是问题。 –

+2

你知道这篇文章告诉你为什么它在代码下面泄漏。此外,代码是不是内存泄漏,因为我们没有上下文。 – NathanOliver

回答

7

您正在有选择地阅读。从原来的网站

报价您链接:

超出范围的指针

void memLeak() 
{ 
    int *data = new int; 
    *data = 15; 
} 

在这个例子中有内存泄漏,因为没有人删除data,它变得不可达的之后memLeak

此片段:

int *data = new int; 
*data = 15; 

是不是内存泄漏本身

3

你必须考虑到代码的完整的上下文:

void memLeak() 
{ 
    int *data = new int; 
    *data = 15; 
} 

在这种情况下,一旦函数返回时,你不再有权访问指针,因此将无法恢复分配给该指针的内存。

-1

单独注意,data = 0x00123比内存泄漏要糟糕得多。这是未定义的行为

+0

为什么,如果我没有访问该内存? – Narek

+0

这是不正确的。你可以指定任何你想要的堆栈变量。 – Aenimated1

+0

@Narek,因为这变成了一个无效的指针。标准对于无效指针非常严格。 – SergeyA