如何在C++中使用数组演示内存错误

Seb*_*ler 6 c++ arrays memory-leaks

我正在尝试使用Arrays和C++来演示一种难以检测的内存错误的方法.目的是激励STL vector <>与迭代器结合使用.

编辑:接受的答案是我用来解释优点/缺点的答案.我也用过:这个

Ste*_*hen 8

不正确地配对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'太大而炸掉堆栈.然后是蹩脚的错误.

  • C++不支持VLA. (3认同)

Unc*_*ens 6

内存泄漏?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[]>)

  • VC++不是唯一带有迭代器调试的C++库.STLPort也有它,当你用`-D_GLIBCXX_DEBUG`编译时,libstdc ++(GNU C++库)就有它. (2认同)
  • @Ken:谢谢你告诉我.(当我选择矢量时,我个人认为不安全,我选择它是因为它只是为我做的事情.) (2认同)