2010-05-17 138 views
13
char *pointer1; 
char *pointer2; 

pointer1 = new char[256]; 
pointer2 = pointer1; 

delete [] pointer1; 

换句话说,我还必须做delete [] pointer2吗?这是内存泄漏吗?

谢谢!

+27

作为一个经验法则,delete的应该是通常匹配'new'的#号。 – Amber 2010-05-17 21:19:30

+0

你不删除指针,你删除它们指向的东西。 – immibis 2016-01-30 13:17:13

回答

17

不,这段代码很好,不会泄漏内存。

您只需要使用delete []一次,因为您只使用了一个新的内存来为内存分配一个区域,即使有两个指向同一内存的指针。

+12

正确。实际上,你**不能** - 试图两次删除同一个内存块会导致未定义的行为。 – 2010-05-17 21:20:33

+4

还应该注意的是,任何试图推行'pointer2'的尝试都会导致未定义的行为。 – 2010-05-17 21:23:48

+0

side ..当你在学习..我会说这是一个好主意,设置pointer1 = NULL;作为删除的反射。我已经看到了一堆代码,其中指针被删除,但后来该应用程序做了一个if(pointer1).. – baash05 2010-05-17 22:48:33

0

只能使用时所使用的新

删除

良好实践的研究是指针1设置为NULL,但你不会有内存泄漏,如果你不

1

delete删除,这是记忆由new分配。由于您只有一个new,您只需要一个delete

7

一个简单的规则:您需要尽可能多的delete s,因为有new s。更好的是,使用像智能指针或容器这样的东西来为你照顾它。

而另一个小点:pointer2一旦您拨打deletepointer1,就会变成“摇晃的指针”。

+2

请注意,指针1也成为删除后的悬挂指针... – 2010-05-17 21:33:56

+0

非常真实,但我认为这是更明显:) – 2010-05-17 23:43:11

0

不,您不必删除[]指针2,因为您还没有为它分配内存!

该语句pointer2 = pointer1使得pointer2指向与pointer1相同的内存地址,不会为其分配任何额外的内存。

+0

Um ...'pointer2'指向与*'pointer1'相同的地址*不是指向'pointer1'的地址('pointer1'的地址是'&pointer1'。 – 2010-05-17 21:25:42

+0

@Nathan Ernst:对不起,我误打错了。更正 – nico 2010-05-17 21:29:46

0

每个new应该只有一个匹配delete。如果您删除了另一个指针,则会违反该规则。

0

你在这里做的只是告诉new char[256]分配的内存块将在同一时刻由pointer1pointer2指向。

如果您之后写入delete[] pointer2;语句,则会出现内存泄漏。

+2

如果他删除了pointer2,这将是未定义的行为,实际上,我没有知道一个平台会导致内存泄漏,很可能你会得到像segfault/AV这样的东西。 – 2010-05-17 21:24:21

2

虽然它不会泄露内存,如果你想成为明确的,你应该同时设置point1point2为NULL(太初始化他们的方式。)

4

这不是一个泄漏,但它是问为了麻烦。 pointer2指向谁知道什么,只要您删除pointer1。这就是所谓的“悬挂指针”。使用它可以在最好的情况下导致段错误,并且在最坏的情况下会导致神秘的数据在最终分配相同位置的任何事情中发生混乱。

0

以下是您思考的空白:您不要删除指针 - 删除内存。您只需使用一个指针来标识要释放的内存块。由于两个变量指向相同的内存,因此删除一个变量恰恰等同于删除另一个变量。换句话说,删除两者与删除其中一个两次相同 - 这显然是错误的。

2

另外,考虑使用来自Boost库的boost::shared_ptr<>。这是自切片面包以来最伟大的事情。当最后一个指向它的指针超出范围

typedef boost::shared_ptr<TypeX> StrRef; 

foo() { 
    StrRef pointer1(new TypeX); 

    while(something) { 
    StrRef pointer2 = pointer1; 
    // do stuff 
    } 

return; 
} 

数据(TypeX)将被删除。你可以用内置的auto_ptr<>型类似的东西,如果你不需要引用计数:

typedef auto_ptr<TypeX> StrRef; 

foo() { 
    StrRef pointer1(new TypeX); 

    while(something) { 
    TypeX * pointer2 = pointer1.get(); 
    subroutine(pointer2); 
    if (condition) return; 
    } 

return; 
} 

每当pointer1超出范围时,它会删除数据。这样做的好处是,您不必记得在底部的return语句之前放置一个删除,并且如果pointer1由于任何其他原因超出了范围(即从循环中间返回,或者subroutine()引发异常,则数据将仍然被正确释放。

我没有测试此代码,所以你必须检查文档的auto_ptr<>boost::shared_ptr<>自己。

我强烈建议使用Boost库一样多尽可能它是由pro编写的,它基本上是一个用于扩展C++的临时区域。