Redian新闻
>
路上遇尴尬结果遇到好心人
avatar
路上遇尴尬结果遇到好心人# Working - 上班一族
P*y
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
avatar
a*0
2
从来都没有这么丢人过啊,眼看公车就快要走了,我就准备跑一下努力追上公车,谁
曾想我摔倒了真的是太尴尬了,上班高峰期啊好多人都在看着,我都能感觉出来摔的特
别厉害,整个身体都能疼,我是直接趴地下的,手都被磨破皮了,当时就蒙圈了,缓了
好久才打算站起来。这时候来了一个很帅的歪果小伙,是真的很帅啊,他主动扶我起来
,炒鸡温柔啊,真是倒霉的事情遇到了好心人,还算心情愉快点,要不得哭死。
他看旁边有药店直接扶我过去了,买了酒精、棉签还有创口贴,简直太贴心,感动死
了快,他本想帮我清洗之后给我贴创口贴实在是不太好意思啊。在我交钱的这个功夫他
居然走了,我连名字和电话都没有问呢,很想感谢他啊,或者是请喝咖啡什么的,帮了
我这么大忙居然没有收到我的一句谢谢,我也是够讨厌的。当时就应该让他帮我消毒的
,那样还能聊聊天啊,这说不上就勾搭上了呢,我真是郁闷啊。
今天真的太倒霉了,跌倒虽然被扶起来了,可那么帅的帅哥却没有勾搭上,真是太失
败了。不过长那么帅还有一颗善良的心真的是难能可贵呢,默默为他祝福吧。
avatar
B*t
3
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"

avatar
s*s
4
呵呵, 你很有钻研精神 :)
你可以看一下 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"

avatar
m*9
5
C++ FAQ里面讲到了这部分,如果我没记错的话,constructor出错不会产生泄漏,
但是destructor出错就有问题了
avatar
x*y
6
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"

avatar
v*s
7
正解!

Printer

【在 B*****t 的大作中提到】
: Printer* Printer::makePrinter() {
: Printer* pPrinter = NULL;
: try {
: pPrinter = new Printer;
: } //编译器在这里加入了汇编代码。当Printer的构造函数或者Printer父类的构造
: 函数Throw Exception时,会自动跳到这里这些执行这些代码,然后根据分配给Printer
: 在堆上内存的地址,回收这些内存, 对pPrinter的赋值不会被执行,调用析构函数也不
: 会被调用。
: ...
: }

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。