以下操作有什么错?
std::string* stringArray = new std::string[100];
...
delete stringArray;
这段代码导致未定义行为。最起码stringArray所含的100个string对象中的99个不太可能被适当删除,因为它们的析构函数很可能每被调用。
当你对着一个数组使用delete,唯一能够让delete直到内存中是否存在一个数组大小记录的办法就是:由你来告诉它。如果你使用delete时加上方括号,delete便认定指针指向一个数组,否则它便认定指针指向单一对象:
std::string* stringPtr1 = new std::string;
std::string* stringPtr2 = new std::string[100];
...
delete stringPtr1;
delete[] stringPtr2;
规则含简单:如果你调用new时使用 []
,你必须在对应调用delete时也使用 []
;如果你调用new时没有使用 []
,那么也不应该在对应调用delete时使用 []
。
考虑下面这个typedef:
typedef std::string AddressLines[4];
由于AddressLines是个数组,如果这样使用new:
std::string* pal = new AddressLines;
那就必须匹配数组形式的delete:
// delete pal; // UB!
delete[] pal; // ok
为了避免诸如此类的错误,最好尽量不要对数组形式做typedef操作。可使用STL容器对数组的需求降至几乎为0。例如你可以将本例的AddressLines定义为 std::vector<std::string>
。
请记住
- 如果你调用new时使用
[]
,你必须在对应调用delete时也使用[]
;如果你调用new时没有使用[]
,那么也不应该在对应调用delete时使用[]
。