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

时间:2010-05-05 20:40:33

标签: c++ memory-leaks arrays

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

编辑:接受的答案是我用来解释优缺点的答案。我还使用了:this

8 个答案:

答案 0 :(得分:8)

不正确地配对新/删除和新[] /删除[]。

例如,使用:

int *array = new int[5];
delete array;

而不是:

int *array = new int[5];
delete [] array;

虽然c ++标准不允许,但有些编译器支持堆栈分配数组:

int stack_allocated_buffer[size_at_runtime];

这可能是作用域规则的意外副作用(例如,由成员变量隐藏的常量)......并且它会起作用,直到有人通过'size_at_runtime'太大并炸掉堆栈。然后是蹩脚的错误。

答案 1 :(得分:6)

内存泄漏? IMO,vector与迭代器结合使用并不能特别保护你免受错误的影响,比如超出界限或者通常使用无效的迭代器(除非你有VC ++和迭代器调试);相反它很方便,因为它为您实现了一个动态可调整大小的数组,并负责内存管理(NB!有助于使您的代码更加异常安全)。

void foo(const char* zzz)
{
    int* arr = new int[size];
    std::string s = zzz;
    //...
    delete[] arr;
}

如果发生异常(例如创建字符串时),则上面可能会泄漏。没有矢量。

Vector也因为它的值语义而更容易推理代码。

int* arr = new int[size];
int* second_ref = arr;
//...
delete [] arr; 
arr = 0; //play it safe :)

//...
second_ref[x] = y;
//...
delete [] second_ref;

但也许一个向量不会自动满足100%的动态数组用例。 (例如,还有boost::shared_array和将来的std::unique_ptr<T[]>

答案 2 :(得分:4)

我认为std :: vector的实用程序确实显示了何时需要动态数组。

使用std :: vector创建一个示例。然后使用数组重新分配一个示例。我认为这说明了一切。

答案 3 :(得分:3)

一个显而易见的事实:

for (i = 0; i < NUMBER_OF_ELEMENTS; ++i)
    destination_array[i] = whatever(i);

for (i = 0; i < NUMBER_OF_ELEMENTS; ++i)
    destination_vector.push_back(whatever(i));

指出你知道第二个有效,但是第一个是否有效取决于destination_array的定义方式。

答案 4 :(得分:3)

void Fn()
{
    int *p = new int[256];
    if ( p != NULL )
    {
        if ( !InitIntArray( p, 256 ) )
        {
              // Log error
              return;
        }
        delete[] p;
    }
}

你不会相信我经常看到这一点。任何形式的RAII都有用的典型例子......

答案 5 :(得分:3)

我认为使用vector而不是动态数组的基本简单性已经令人信服。

  1. 你不必记得删除你的记忆......这不是那么简单,因为删除它的尝试可能被异常和诸如此类的东西绕过。
  2. 如果你想自己做动态数组,在C ++中最安全的做法是将它们包装在一个类中并使用RAII。但是矢量可以帮到你。实际上,这就是重点。
  3. 为您完成调整大小。
  4. 如果您需要支持任意类型,则无需进行任何额外的工作。
  5. 提供了许多算法,这些算法旨在处理容器,包括其他用户和其他用户。
  6. 如果需要,你仍然可以通过传递向量的底层数组来使用需要数组的函数;保证内存与标准是连续的,除了vector<bool>(谷歌说2003年,参见规范的23.2.4./1)。
  7. 一般来说,使用数组可能是不好的做法,因为你将re-inventing the wheel ...而且你的实现几乎肯定会比现有的更糟糕......并且其他人使用起来比较困难,因为他们知道vector而不是你的奇怪事情。
  8. 使用动态数组,您需要自己跟踪大小,当您想要插入新元素时增长它,在不再需要时删除它...这是额外的工作。 哦,还有一个警告:vector<bool>是一个肮脏的烂黑客和过早优化的经典例子。

答案 6 :(得分:2)

为什么不根据STL提供的算法来激励它?

答案 7 :(得分:0)

在原始数组中,operator [](如果我可以这样调用的话)容易受到索引越界问题的影响。使用矢量它不是(至少有一个运行时异常)。

抱歉,我没有仔细阅读这个问题。 index-out-of-bound是一个问题,但不是内存错误。