问题聚焦:     我们都知道,new和delete要成对使用,但是有时候,事情往往不是按我们预期的那样发展.     对于单一对象和对象数组,我们要分开考虑     遇到typedef时,也需要搞清楚,是单一对象类型还是对象数组类型   来看一个例子: std::string* stringArray = new std::string[100]; ... delete stringArray; 问题:stringArray所含的100个string对象中的99个可能并没有被适当地删除,因…
1. 一个错误释放内存的例子 下面的场景会有什么错? std::]; ... delete stringArray 一切看上去都是有序的.new匹配了一个delete.但有一些地方确实是错了.程序的行为是未定义的.至少来说,stringArray指向的100个string对象中的99个看上去都不能被正确释放,因为他们的析构函数可能永远不会被调用. 2. 使用new 和delete时究竟做了啥? 当你使用一个new表达式(通过使用new动态的创建一个对象)时,会发生两件事情.第一,内存被分配(通过…
如果你在new表达式中使用[],必须在相应的delete表达式中也使用[].如果你在new表达式中不使用[],一定不要在相应的delete表达式中使用[].…
NOTE: 1.如果你在new表达式中使用[],必须在相应的delete表达式中也使用[].如果你在new表达式中不使用[],一定不要在相应的delete表达式中使用[].…
简而言之,new时不带[],delete时也不带[]:new时带[],delete时也要带[].如果不匹配,要么造成多销毁对象,导致未定义行为:要么导致少销毁对象,导致内存泄漏.…
这一节比较简单,可以总结为以下: std::string *stringPtr1 = new std::string; std::]; .. delete stringPtr1; // delete an object delete [] stringPtr2; // delete an array of objects ◆总结 如果你在new表达式中使用[],那么释放内存的时候也一定要用delete [].如果未使用[],那么在相应的delete表达式中也不要使用[].…
请牢记: 如果在new表达式中使用[],必须在相应的delete表达式中也使用[]. new[]  对应  delete[] 如歌在new表达式中不适用[],一定不要在相应的delete表达式中使用[]. new 对应 delete 当使用new时(即通过new动态生成一个对象),有两件事发生:第一,内存被分配出来(通过名为operator new 的函数):第二,针对此内存会有一个(或更多)构造函数被调用. 当使用delete时,也有两件事发生:针对此内存会有一个(或更多)析构函数被调用,然后…
string *stringarray = new string[100]; ... delete stringarray; 上述程序的运行情况将是不可预测的.至少,stringarray指向的100个string对象中的99个不会被正确地摧毁,因为他们的析构函数永远不会被调用. 用new的时候会发生两件事.首先,内存被分配(通过operator new 函数,详见条款7-10和条款m8),然后,为被分配的内存调用一个或多个构造函数.用delete的时候,也有两件事发生:首先,为将被释放的内存调…
问题聚焦:     我们都知道,new和delete要成对使用,但是有时候,事情往往不是按我们预期的那样发展.     对于单一对象和对象数组,我们要分开考虑.     遇到typedef时,也需要搞清楚,是单一对象类型还是对象数组类型. 来看一个例子: std::string* stringArray = new std::string[100]; ... delete stringArray; 问题:stringArray所含的100个string对象中的99个可能并没有被适当地删除,因为它…
std::string* stringPtr1=new std::string; srd::string* stringPtr2=new std::string[100];   对应地 delete也应该使用相同的形式:   delete stringPtr1; delete [] stringPtr2;   规则就是:使用new时用了[],必须在对应调用delete时也要使用[]. 如果new时没有用[],则调用delete时也不该用[]   在typedef中也一样: 当程序员以new创建t…