如此用 this 清空结构体 可以吗?

时间:2023-02-13 07:46:04
struct STEST 
{
   DWORD aaaa;
char bbbb[1024];
  void cls()
{
ZeroMemory(this,sizeof(STEST));
}
};

我自己试了一下,这样可以用? 

请高手指明,这样会不会有不安全因素?

this 就是指向的结构体本身吧?

16 个解决方案

#1


个人觉得应该可以吧,等待高手解答。

#2


貌似可以,不过结构体里有CTime会报错。

#3


可以。
this就是一个指向对象的指针。

#4


应该通过析构函数。

#5


这个还确实不太清楚,
 不过不建议这样的编程风格!

#6


这只是把那块内存的数据都变成了0,栈指针还是没有移动。
这样不会出错,你的这个结构体只存了几个变量而已,等于是把那块内存的变量所有的值都设置成了0,这块的值也是正确的。
等到函数返回的时候,栈指针移动,栈顶的元素依次pop出去,这当然可以。
虽然你这样设置了0,但是这个对象依然存在,里面的数据照样可以访问。
例如
#include "iostream"
#include "memory.h"
using namespace std;

class A
{
public:
int i;
int b;
void func()
{
memset(this,0,sizeof(A));
}
};

int main()
{
A a;
A* pa=&a;
a.func();
cout<<(*pa).i;
}


不过这个类如果有虚函数的话又不一样了,你这么操作会把虚函数表的指针也设置成0了。那这个对象也就是错误的了。你不能调用其中的虚函数了。

#7


这只是把那块内存的数据都变成了0,栈指针还是没有移动。
这样不会出错,你的这个结构体只存了几个变量而已,等于是把那块内存的变量所有的值都设置成了0,这块的值也是正确的。
等到函数返回的时候,栈指针移动,栈顶的元素依次pop出去,这当然可以。
虽然你这样设置了0,但是这个对象依然存在,里面的数据照样可以访问。
例如
#include "iostream"
#include "memory.h"
using namespace std;

class A
{
public:
int i;
int b;
void func()
{
memset(this,0,sizeof(A));
}
};

int main()
{
A a;
A* pa=&a;
a.func();
cout<<(*pa).i;
}


不过这个类如果有虚函数的话又不一样了,你这么操作会把虚函数表的指针也设置成0了。那这个对象也就是错误的了。你不能调用其中的虚函数了。

#8


试了一下,很奇怪,我的类有虚函数的,的确把虚函数表指针也清0了.
但是还是可以调用虚函数.

不过还是同意你们的观点,这样清0的做法,还是千万不要做.

#9


呃。。试了下,用对象可以调用虚函数,但是指针调用就出错了。
这也就是那啥,对象不具有多态性,只有指针和引用才能表现出多态。。

对象的函数调用,是在编译时就确定了,编译器直接把函数调用转换成 执行到函数的入口地址了。但是指针和引用是运行时绑定的,他的入口地址的确定是要运行时查虚函数表的

#10


如果清楚自已的结构的定义,没有虚函数,没有动态数组类型成员变量(如string),这样做还是比较有效率的。

#11


7楼正确
Test* pT = new Test;
pT->VF();
memset(pT,0,sizeof(Test));
pT->VF();
这样试真的出错了.

今天又学习了!

#12


- -  这么做有什么意义呢。。如果要删除这个对象,那么函数返回,栈自然就把这个对象删除了。
如果要清空了赋新值,那就直接赋值。。

#13


赫赫。。互相学习。。今天也向你学到了MAKEINTRESOURCEA

#14


struct 就是变相的 class ,只不过默认的权限是 public 罢了。
当 STEST   是一个 POD 数据类型时,可以这样用
否则十有八九要出错

#15


如果结构中的成员变量不包含虚函数,而且这个类也没有虚函数,可以这么用

#16


引用 6 楼 heiheizh618 的回复:
这只是把那块内存的数据都变成了0,栈指针还是没有移动。
这样不会出错,你的这个结构体只存了几个变量而已,等于是把那块内存的变量所有的值都设置成了0,这块的值也是正确的。
等到函数返回的时候,栈指针移动,栈顶的元素依次pop出去,这当然可以。
虽然你这样设置了0,但是这个对象依然存在,里面的数据照样可以访问。
例如

C/C++ code
#include "iostream"
#i……


感觉几位的回复,其实我只是单纯的想初始化结构体,
里面只有几个数据而已

看来是可行的,

非常 感谢各位

#1


个人觉得应该可以吧,等待高手解答。

#2


貌似可以,不过结构体里有CTime会报错。

#3


可以。
this就是一个指向对象的指针。

#4


应该通过析构函数。

#5


这个还确实不太清楚,
 不过不建议这样的编程风格!

#6


这只是把那块内存的数据都变成了0,栈指针还是没有移动。
这样不会出错,你的这个结构体只存了几个变量而已,等于是把那块内存的变量所有的值都设置成了0,这块的值也是正确的。
等到函数返回的时候,栈指针移动,栈顶的元素依次pop出去,这当然可以。
虽然你这样设置了0,但是这个对象依然存在,里面的数据照样可以访问。
例如
#include "iostream"
#include "memory.h"
using namespace std;

class A
{
public:
int i;
int b;
void func()
{
memset(this,0,sizeof(A));
}
};

int main()
{
A a;
A* pa=&a;
a.func();
cout<<(*pa).i;
}


不过这个类如果有虚函数的话又不一样了,你这么操作会把虚函数表的指针也设置成0了。那这个对象也就是错误的了。你不能调用其中的虚函数了。

#7


这只是把那块内存的数据都变成了0,栈指针还是没有移动。
这样不会出错,你的这个结构体只存了几个变量而已,等于是把那块内存的变量所有的值都设置成了0,这块的值也是正确的。
等到函数返回的时候,栈指针移动,栈顶的元素依次pop出去,这当然可以。
虽然你这样设置了0,但是这个对象依然存在,里面的数据照样可以访问。
例如
#include "iostream"
#include "memory.h"
using namespace std;

class A
{
public:
int i;
int b;
void func()
{
memset(this,0,sizeof(A));
}
};

int main()
{
A a;
A* pa=&a;
a.func();
cout<<(*pa).i;
}


不过这个类如果有虚函数的话又不一样了,你这么操作会把虚函数表的指针也设置成0了。那这个对象也就是错误的了。你不能调用其中的虚函数了。

#8


试了一下,很奇怪,我的类有虚函数的,的确把虚函数表指针也清0了.
但是还是可以调用虚函数.

不过还是同意你们的观点,这样清0的做法,还是千万不要做.

#9


呃。。试了下,用对象可以调用虚函数,但是指针调用就出错了。
这也就是那啥,对象不具有多态性,只有指针和引用才能表现出多态。。

对象的函数调用,是在编译时就确定了,编译器直接把函数调用转换成 执行到函数的入口地址了。但是指针和引用是运行时绑定的,他的入口地址的确定是要运行时查虚函数表的

#10


如果清楚自已的结构的定义,没有虚函数,没有动态数组类型成员变量(如string),这样做还是比较有效率的。

#11


7楼正确
Test* pT = new Test;
pT->VF();
memset(pT,0,sizeof(Test));
pT->VF();
这样试真的出错了.

今天又学习了!

#12


- -  这么做有什么意义呢。。如果要删除这个对象,那么函数返回,栈自然就把这个对象删除了。
如果要清空了赋新值,那就直接赋值。。

#13


赫赫。。互相学习。。今天也向你学到了MAKEINTRESOURCEA

#14


struct 就是变相的 class ,只不过默认的权限是 public 罢了。
当 STEST   是一个 POD 数据类型时,可以这样用
否则十有八九要出错

#15


如果结构中的成员变量不包含虚函数,而且这个类也没有虚函数,可以这么用

#16


引用 6 楼 heiheizh618 的回复:
这只是把那块内存的数据都变成了0,栈指针还是没有移动。
这样不会出错,你的这个结构体只存了几个变量而已,等于是把那块内存的变量所有的值都设置成了0,这块的值也是正确的。
等到函数返回的时候,栈指针移动,栈顶的元素依次pop出去,这当然可以。
虽然你这样设置了0,但是这个对象依然存在,里面的数据照样可以访问。
例如

C/C++ code
#include "iostream"
#i……


感觉几位的回复,其实我只是单纯的想初始化结构体,
里面只有几个数据而已

看来是可行的,

非常 感谢各位