2014-12-10 76 views
-6

样品在这里:此代码中的内存泄漏?

class A 
{ 
private: 
    int buff[1000]; 
public: 
    A(int n) 
    { 
     buff = new int[n]; 
    } 
}; 

int main() 
{ 
    for (int i = 10; i < 1000; i++) 
    { 
     A a(i); 
    } 
    return 0; 
} 

谁能帮助我?这段代码有什么问题?内存泄漏?或者是其他的错误?

+10

是的,显然。你有一个没有匹配delete的'new'。 – 2014-12-10 22:21:19

+3

内存泄漏应该是您最担心的问题。这段代码甚至没有编译。 – 0x499602D2 2014-12-10 22:21:49

+3

如果它不编译,它不会泄漏,是吗? – 2014-12-10 22:27:22

回答

1
从问题

除了在评论中指出,应该(用new关键字)创造出你在堆上分配的项目要求delete[]析构函数:

class A{ 
    private: 
     int buff[1000]; 
    public: 
     A(int n){ 
      buff=new int[n]; 
     } 
     ~A() { 
      delete[] buff; 
     } 
}; 

int main(){ 
    for(int i=10;i<1000;i++){ 
     A a(i); 
    } 
    return 0; 
} 

不要忘了[]delete之后,因为它是一个数组。

+3

这仍然不会编译。数组不可分配。 – 0x499602D2 2014-12-10 22:27:10

+0

@ 0x499602D2,好吧,tigerrussell说:“从评论中指出的问题来看......” – kay 2014-12-10 22:28:08

+0

@Kay评论中没有指出其他具体问题。 OP不知道数组是不可分配的。 – 0x499602D2 2014-12-10 22:29:51

0

现代C++说你应该在你的代码中使用newdelete,而是std::unique_ptr它为你做内存管理。

因此,您的类将适合现代成语这样更好:

#include <memory> 

class A 
{ 
private: 
    std::unique_ptr<int[]> buff; 
public: 
    A(int n) 
     : buff(std::make_unique(int[n])) // buff(new int[n]) if using C++11 
    { } 
}; 

int main() 
{ 
    A a(5); 
    return 0; 
} 

可惜std::make_unique不可用在C++ 11,所以在那之前,你必须使用new。但是,您仍然可以使用std::unique_ptr,这将解决您的内存泄漏问题。