P***y 发帖数: 2885 | 1 问在堆上分配内存的问题。问详细过程,小弟一问三不知。只知道用new operator.有个
问题是如果Constructor失败怎么办,会不会有内存泄漏什么的。后来才知道调用new在
堆上分配的时候,先调用operator new去拿到一块raw memory,然后在此内存上调用Con
structor,但问题是这个时候Constructor throw exception,然后就Fail了。。。。
问题就在这儿,由于前面用operator new分配了一块的raw memory,这时候有没有内存泄
漏???
回来以后自己找了个程序来调试,故意让它Constructor不成功。。。但是依然没有看出
那块事先分配的raw memory是怎样回收回去的。。。
各位有空的话帮我看看,我把我自己的源程序给贴上来。。。
#include "stdafx.h"
#include
using namespace std;
///// class Counted
template
class Counted {
public:
clas | B*****t 发帖数: 335 | 2 Printer* Printer::makePrinter() {
Printer* pPrinter = NULL;
try {
pPrinter = new Printer;
} //编译器在这里加入了汇编代码。当Printer的构造函数或者Printer父类的构造
函数Throw Exception时,会自动跳到这里这些执行这些代码,然后根据分配给Printer
在堆上内存的地址,回收这些内存, 对pPrinter的赋值不会被执行,调用析构函数也不
会被调用。
...
}
有个
Con
存泄
看出
【在 P***y 的大作中提到】 : 问在堆上分配内存的问题。问详细过程,小弟一问三不知。只知道用new operator.有个 : 问题是如果Constructor失败怎么办,会不会有内存泄漏什么的。后来才知道调用new在 : 堆上分配的时候,先调用operator new去拿到一块raw memory,然后在此内存上调用Con : structor,但问题是这个时候Constructor throw exception,然后就Fail了。。。。 : 问题就在这儿,由于前面用operator new分配了一块的raw memory,这时候有没有内存泄 : 漏??? : 回来以后自己找了个程序来调试,故意让它Constructor不成功。。。但是依然没有看出 : 那块事先分配的raw memory是怎样回收回去的。。。 : 各位有空的话帮我看看,我把我自己的源程序给贴上来。。。 : #include "stdafx.h"
| s******s 发帖数: 3694 | 3 呵呵, 你很有钻研精神 :)
你可以看一下 C++ F&A Lites, 里面对于 Constructor and Destructor 失败如何处
理有比
较详细的描述。
面试这种问题感觉才是有点意思, -:)
有个
Con
存泄
看出
【在 P***y 的大作中提到】 : 问在堆上分配内存的问题。问详细过程,小弟一问三不知。只知道用new operator.有个 : 问题是如果Constructor失败怎么办,会不会有内存泄漏什么的。后来才知道调用new在 : 堆上分配的时候,先调用operator new去拿到一块raw memory,然后在此内存上调用Con : structor,但问题是这个时候Constructor throw exception,然后就Fail了。。。。 : 问题就在这儿,由于前面用operator new分配了一块的raw memory,这时候有没有内存泄 : 漏??? : 回来以后自己找了个程序来调试,故意让它Constructor不成功。。。但是依然没有看出 : 那块事先分配的raw memory是怎样回收回去的。。。 : 各位有空的话帮我看看,我把我自己的源程序给贴上来。。。 : #include "stdafx.h"
| m******9 发帖数: 968 | 4 C++ FAQ里面讲到了这部分,如果我没记错的话,constructor出错不会产生泄漏,
但是destructor出错就有问题了 | x***y 发帖数: 633 | 5 You can have a look at effective C++ about placement new and delete, in
which it says that the runtime system will call the operator delete
corresponding to the operator new if an exception arises in the coupled
construtor call...So, no memory leak will be caused.
有个
Con
存泄
看出
【在 P***y 的大作中提到】 : 问在堆上分配内存的问题。问详细过程,小弟一问三不知。只知道用new operator.有个 : 问题是如果Constructor失败怎么办,会不会有内存泄漏什么的。后来才知道调用new在 : 堆上分配的时候,先调用operator new去拿到一块raw memory,然后在此内存上调用Con : structor,但问题是这个时候Constructor throw exception,然后就Fail了。。。。 : 问题就在这儿,由于前面用operator new分配了一块的raw memory,这时候有没有内存泄 : 漏??? : 回来以后自己找了个程序来调试,故意让它Constructor不成功。。。但是依然没有看出 : 那块事先分配的raw memory是怎样回收回去的。。。 : 各位有空的话帮我看看,我把我自己的源程序给贴上来。。。 : #include "stdafx.h"
| v****s 发帖数: 1112 | 6 正解!
Printer
【在 B*****t 的大作中提到】 : Printer* Printer::makePrinter() { : Printer* pPrinter = NULL; : try { : pPrinter = new Printer; : } //编译器在这里加入了汇编代码。当Printer的构造函数或者Printer父类的构造 : 函数Throw Exception时,会自动跳到这里这些执行这些代码,然后根据分配给Printer : 在堆上内存的地址,回收这些内存, 对pPrinter的赋值不会被执行,调用析构函数也不 : 会被调用。 : ... : }
|
|