Seb*_*ler 6 c++ arrays memory-leaks
我正在尝试使用Arrays和C++来演示一种难以检测的内存错误的方法.目的是激励STL vector <>与迭代器结合使用.
编辑:接受的答案是我用来解释优点/缺点的答案.我也用过:这个
不正确地配对new/delete和new []/delete [].
例如,使用:
int *array = new int[5];
delete array;
Run Code Online (Sandbox Code Playgroud)
代替:
int *array = new int[5];
delete [] array;
Run Code Online (Sandbox Code Playgroud)
虽然c ++标准不允许,但是一些编译器支持堆栈分配数组:
int stack_allocated_buffer[size_at_runtime];
Run Code Online (Sandbox Code Playgroud)
这可能是作用域规则的意外副作用(例如,由成员变量不断遮蔽)......并且它会起作用,直到有人通过'size_at_runtime'太大而炸掉堆栈.然后是蹩脚的错误.
内存泄漏?IMO,vector与迭代器结合使用并不能特别保护你免受错误的影响,比如超出界限或者通常使用无效的迭代器(除非你有VC++和迭代器调试); 相反它很方便,因为它为您实现了一个动态可调整大小的数组,并负责内存管理(注意!帮助您的代码更加安全).
void foo(const char* zzz)
{
int* arr = new int[size];
std::string s = zzz;
//...
delete[] arr;
}
Run Code Online (Sandbox Code Playgroud)
如果发生异常(例如,在创建字符串时),则上面可能会泄漏.没有矢量.
Vector还因为其值语义而更容易推理代码.
int* arr = new int[size];
int* second_ref = arr;
//...
delete [] arr;
arr = 0; //play it safe :)
//...
second_ref[x] = y;
//...
delete [] second_ref;
Run Code Online (Sandbox Code Playgroud)
但也许一个向量不会自动满足100%的动态数组用例.(例如,还有boost::shared_array
未来std::unique_ptr<T[]>
)