我想知道new
和delete
的经验法则是什么。
我一直认为,每次拨打new
时,我都应该delete
。
在下面的情况中,如果我包含destructor
,我会变坏
多余的错误。如果我不包含destructor
,我的代码工作正常。
struct Foo
{
Foo(int A, int B)
{
bar = new std::vector< std::vector < int > >(A, std::vector<int>(B,2);
//creates a vector of A vectors where each nested vector contains the number 2 B times.
}
~Foo() //Get bad access error if destructor included in code.
{
delete[] bar;
}
std::vector< std::vector < int > > *bar;
};
int main()
{
Foo X;
return 0;
}
答案 0 :(得分:8)
应该是delete bar;
而不是delete [] bar;
将另一条规则添加到规则列表中。
只有当新行有[某个数字]
时,删除行才应该有[]
在您的情况下,new
行没有[some number]
bar = new std::vector< std::vector < int > >(A, std::vector<int>(B,2);
所以你的删除行也不应该有。
答案 1 :(得分:6)
上面的类可能写得更好:
struct Foo
{
Foo(int A, int B)
: bar(A, std::vector<int>(B,2)) //creates a vector of A vectors where each nested vector contains the number 2 B times.
{}
// Default copy
// Default destructor.
std::vector< std::vector < int > > bar;
};
这可以避免明确的new
和delete
;通常是正确使用它们的最佳rule of thumb
!
答案 2 :(得分:0)
对于像c ++这样的非托管代码,经验法则是您的设计所需的任何内容。
一般来说,清理对象以避免内存泄漏是一个好主意,但是你可能会遇到想要在内存中保留内容的情况。