新建和删除的经验法则
rule of thumb for new and delete
我想知道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;
}
它应该是delete bar;
而不是delete [] bar;
将另一个规则添加到规则列表中。
仅当新行具有 [某个数字] 时,删除行才应具有 []
在您的情况下,new
线没有[some number]
bar = new std::vector< std::vector < int > >(A, std::vector<int>(B,2);
所以你的删除行也不应该有一个。
上面的类可能写成:
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
!
对于像
c++ 这样的非托管代码,经验法则是您的设计所需的任何内容。
通常,清理对象以避免内存泄漏是个好主意,但您可能会遇到想要在内存中保留某些内容的情况。
相关文章:
- 将数组的地址分配给变量并删除
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- 从链接列表c++中删除一个项目
- C++如何通过用户输入删除列表元素
- 何时返回指针与返回对象的一般经验法则?
- 点云库 (PCL) - 声明点云时何时应使用 ::P tr 的经验法则?
- 是按值抛出和按引用捕获的经验法则
- 并发::并行端口开销和性能命中率(经验法则)
- 新建和删除的经验法则
- unique_ptr、自定义删除程序和零法则
- 在C++中使用指针或引用作为函数的返回类型是否有经验法则
- 当通过值传递比通过常量引用传递快时的经验法则
- 标准库/模板化容器的常量语义的经验法则
- C++构造函数重载的经验法则
- 当“虚拟”是一个相当大的开销时,有什么经验法则吗
- 避免违反严格混叠规则的最简单的经验法则
- C++ 零法则:多态删除和unique_ptr行为
- 将函数放在头文件中的经验法则
- 使用 auto&& 和 const auto & 的经验法则