这样有没有内存泄漏

ttreport 2008-04-07 10:04:32
class A
{
public:
string str;
void clear(){ memset(this, 0, sizeof(*this);}
}


我个人认为不会,不过总觉得这代码别扭.
...全文
716 73 打赏 收藏 举报
写回复
73 条回复
切换为时间正序
请发表友善的回复…
发表回复
ttreport 2008-04-08
  • 打赏
  • 举报
回复
结贴了,与string实现有关,VC7.1的std::string与CString没内存泄漏,有些实现有.试过了45楼的代码了
不想低调 2008-04-08
  • 打赏
  • 举报
回复
[Quote=引用 64 楼 taodm 的回复:]
哎,都到63楼了,也没见个勤快人肯用devcpp编译试一下的。
汗2把先。
[/Quote]
我试了下 程序异常终止了 什么道理??
kakaying 2008-04-08
  • 打赏
  • 举报
回复
楼上的说法就够精辟。
45楼的代码,我刚刚做过了试验,没有造成内存泄露的原因在于,代码中存在一个错误!部分修改如下:
struct LAYERDATA
{
int a;
char b;
char c[20];
XStr str;

LAYERDATA() : a(0), b(0){}

void clear()
{
memset(this, 0, sizeof(*this));// 注意这里,原45楼代码取的是sizeof(this)
}

~LAYERDATA() { cout << "~LAYERDATA" ; }
};


原45楼代码取的是sizeof(this) = 4,其memset()的结果就是整个结构里的int a被清零了,而b,c, str所占内存单元没有变化,所以每次都能成功delete。修改为*this后,str.m_pSz也会被memset()清零,导致delete出错!
手插兜兜 2008-04-08
  • 打赏
  • 举报
回复
既然类的内部已经使用了类对象,一般安全的做法是不能直接对类的二进制内存区直接进行操作的,这种做法肯定是不安全的。
r_swordsman 2008-04-08
  • 打赏
  • 举报
回复
太简单了吧?一定会泄露啊
DonyUnx 2008-04-08
  • 打赏
  • 举报
回复
63楼能说清楚点不,告诉我们资料怎么找到呀,光这么一句,让人怎么找呀
taodm 2008-04-08
  • 打赏
  • 举报
回复
哎,都到63楼了,也没见个勤快人肯用devcpp编译试一下的。
汗2把先。
rickone 2008-04-08
  • 打赏
  • 举报
回复
另外,对于认为"虚表使不会存储到类的实体里面"的朋友,那么'多态'是如何实现的呢? 给你一个例子,想一下为什么发生了多态:

class B
{
public:
virtual void foo() { cout<<"B::foo()"<<endl; }
};

class D1 : public B
{
public:
void foo() { cout<<"D1::foo()"<<endl; }
};

class D2 : public B
{
public:
void foo() { cout<<"D2::foo()"<<endl; }
};

int main(int argc, char *argv[])
{
D1 d1;
B *pd2 = new D2;
pd2->foo();
memcpy(pd2,&d1,sizeof(D2)); // 这一句导致上下两句发生'多态',它不同于pd2 = &d1,我是进行值拷贝
pd2->foo();
system("PAUSE");
return EXIT_SUCCESS;
}

PS:可以把sizeof(D1)输出看一下,为什么是4(32位机上),而不是0或者1? 上面这个例子也可以做为反例,用memcpy拷贝两个对象是危险的...
rickone 2008-04-08
  • 打赏
  • 举报
回复
这论坛怎么帖代码的?不太会,直接帖吧:


#include "stdafx.h"
#include <cstdlib>
#include <iostream>
#include "windows.h"

using namespace std;

class A
{
public:
string str;
void clear(){ memset(this,0,sizeof(*this)); }
void foo(){ str += "cplusplus"; }
};

int main(int argc, char *argv[])
{
A a;
for(int i=0;i<1000000;++i)
{
a.str = "rick";
for(int j=0;j<100;++j)
{
a.foo();
}
a.clear();
Sleep(10);
cout<<".";
}
system("PAUSE");
return EXIT_SUCCESS;
}
Dev C++运行时错误,可能是访问了非法内存,VC6可以运行,在任务管理器里可以观察到占用内存的情况,有没有泄漏自己看吧...
rickone 2008-04-08
  • 打赏
  • 举报
回复

#include "stdafx.h"
#include <cstdlib>
#include <iostream>
#include "windows.h"

using namespace std;

class A
{
public:
string str;
void clear(){ memset(this,0,sizeof(*this)); }
void foo(){ str += "cplusplus"; } //增加这样一个函数,它是内存安全的,只是为了防止对常量字符串作的优化
};

int main(int argc, char *argv[])
{
A a;
for(int i=0;i<1000000;++i)
{
a.str = "rick";
for(int j=0;j<100;++j)
{
a.foo();
}
a.clear();
Sleep(10);
cout<<".";
}
system("PAUSE");
return EXIT_SUCCESS;
}

Dev C++运行时错误,可能是访问了非法内存,VC6可以运行,在任务管理器里可以观察到占用内存的情况,有没有泄漏自己看吧...
hoomey 2008-04-07
  • 打赏
  • 举报
回复
学习
ascent2006 2008-04-07
  • 打赏
  • 举报
回复
学习.
庄鱼 2008-04-07
  • 打赏
  • 举报
回复
str在class A中由于不是以指针方式存在的,因此,对this指向内容的赋空值对str实际地址的定位没有影响,不影响string类的资源释放。
DonyUnx 2008-04-07
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 FreeFice 的回复:]
并不会泄露,memset(this,0,sizeof(*this));仅仅是将this指针指向的内容清空(赋空值),而不是将this指针赋空值,这与this=0是两回事。
[/Quote]
看了半天才明白大家说的,感觉这个对!呵呵,学习来了
庄鱼 2008-04-07
  • 打赏
  • 举报
回复
并不会泄露,memset(this,0,sizeof(*this));仅仅是将this指针指向的内容清空(赋空值),而不是将this指针赋空值,这与this=0是两回事。
杨Lanzhou 2008-04-07
  • 打赏
  • 举报
回复
7楼的MM想了很多,非常不错,但是我觉得虚表使不会存储到类的实体里面,所以应该没关系!
45楼的例子很好!
和string的实现有关,在下了解一点!

大家可以看一下有个牛人写的C++的一些insight的东西!

好好学习啊,大家都这样的话中国没希望了!
ttreport 2008-04-07
  • 打赏
  • 举报
回复
我也试过了,如果有内存泄漏,请给出编译器提示
taodm 2008-04-07
  • 打赏
  • 举报
回复
总结性发言就是:即使是很小的程序,我也要用编译器试过了才发言。
我对自己从不信任。
Supper_Jerry 2008-04-07
  • 打赏
  • 举报
回复
taodm总结性发言吧...
别吝啬您的字。
yangmy 2008-04-07
  • 打赏
  • 举报
回复
学习
加载更多回复(53)
相关推荐
发帖
C++ 语言

6.3w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2008-04-07 10:04
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下