读书人

C++内存泄漏的有关问题

发布时间: 2013-03-19 17:22:05 作者: rapoo

C++内存泄漏的问题
各位大虾!小弟对于内存泄有个疑问,像下面这个例子,如果在函数MyFun()里面new出来的MyStruct对象pStru,却又在函数体里面delete掉了,这样delete掉了不就等于把pStru里面的数据都delete掉了吗?
如果是的话,那这样写有什么作用?

void MyFun(OLECHAR* sz)
{
MyStruct* pStru = new MyStruct;
.....
pStru->BSTR = SysAllocString(sz);
.....
delete pStru;
}

c++ delete
[解决办法]
也可以定义局部变量,就不用动态开辟空间了

void MyFun(OLECHAR* sz) 
{
MyStruct Stru ;
.....
Stru.BSTR = SysAllocString(sz);
.....

}


[解决办法]
引用:
各位大虾!小弟对于内存泄有个疑问,像下面这个例子,如果在函数MyFun()里面new出来的MyStruct对象pStru,却又在函数体里面delete掉了,这样delete掉了不就等于把pStru里面的数据都delete掉了吗?
如果是的话,那这样写有什么作用?

void MyFun(OLECHAR* sz)
{
MyStruct* pStru = new MyStruct;
.....
pStru->BSTR = SysAllocString(sz);
.....
delete pStru;
}

你delete掉pStru,但并没有delete掉pStru->BSTR指向的内存块。除非你的MyStruct的析构中有主动去执行delete pStru->BSTR;
[解决办法]
当MyStruct对象很巨大时,放在栈里是个很大的负担。动态分配负担就小很多。
用完释放的话,连堆空间的占用问题也解决了,是很好的方法啊!
[解决办法]
pStru->BSTR 原则上应该在delete pStru;之前释放

遵循谁申请谁释放的原则
[解决办法]
内存泄露就看 SysAllocString的处理了和MyStruct析构时的处理了
如果正确解决这个问题就没有关系。
如果SysAllocString 也是动态分配,而函数MyFun代码本身又没有释放这块内存。
MyStruct析构又(一般结构,析构是什么也不干的,除非写了析构函数)
什么也没干,那么这块内存泄露是必然的了!!
另外所谓的管理代码(安全代码)不是真正C++,是MS的私货。那是有垃圾回收的,不会有真正的内存泄露。
[解决办法]
作用可能是在省略号中
[解决办法]
引用:
这里我delete了0对象之后,cout<<o对象的d就崩溃了,不明白2楼所说的是不是我这个代码表达的意思

class one
{
public:
one()
{
a = 10;

}
~one()
{
a = 0;


}

int a;


int* d;
};

one* o = new one;
o->a = 1;
o->d = new ……
肯定会错了,o指向的内存已经释放(交还给操作系统了)了,你又访问他是不行的。2楼意思是你这样先释放o的话,其中的成员d申请的空间就没法释放了,会造成内存泄露,正确的做法就是先释放d,然后在释放o
[解决办法]
引用:
引用:各位大虾!小弟对于内存泄有个疑问,像下面这个例子,如果在函数MyFun()里面new出来的MyStruct对象pStru,却又在函数体里面delete掉了,这样delete掉了不就等于把pStru里面的数据都delete掉了吗?
如果是的话,那这样写有什么作用?

void MyFun(OLECHAR* sz)
……


顶一个。这已经说到点上了
[解决办法]
泄漏不泄漏得看 MyStruct类类型的定义

读书人网 >C++

热点推荐