Skip to content

Latest commit

 

History

History
48 lines (34 loc) · 1.66 KB

File metadata and controls

48 lines (34 loc) · 1.66 KB

条款16:成对使用new和delete时要采用相同形式

以下操作有什么错?

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时使用 []