C++程序查错题,大家来看看。

xbdtb 2006-08-06 12:34:38
应聘时碰到如下题目,大家发表意见,让我确认一下。

//指出下列代码的错误
//-------------------------------------------------
struct myClass
{
int m_a;

myClass(){ memset( this , 0 , sizeof( myClass ) ) ; }

virtual ~myClass(){};
};
//-------------------------------------------------

//指出下列代码的错误
//-------------------------------------------------
#include <string>
inline const char* fun( const char* _pSZ )
{
std::string sz( _pSZ );
sz += ".txt";
return sz.c_str();
}
...全文
598 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
睡在床板下_ 2006-08-08
  • 打赏
  • 举报
回复
2:由于sz是string类, 函数返回时,sz对象要析构,原本的指针失效了。 进去调试就知道了
并不是 什么局部变量的问题
mhzjy 2006-08-07
  • 打赏
  • 举报
回复
改为return sz.c_str(); //返回局部变量的指针(=_=)

sz是局部变量吧 它在return 后就消失了 谁再来管理指针的内容? 泄露了?
SammyLan 2006-08-07
  • 打赏
  • 举报
回复
return sz.c_str(); //返回局部变量
改为return sz.c_str(); //返回局部变量的指针(=_=)
MD死甘草,非要睬别人的尾巴(=_=)



playmud((猪头流氓)(鄙视老迈)(抵制日货)) ( ) 信誉:100 2006-08-07 09:32:00 得分: 0
清除虚函数表和虚函数指针,我干吗非用new和delete.

不是指针或者引用,调用虚拟函数是静态绑定的,不会动态解析(=_=)
不动态解析就不会用到vptr(=_=)
猪哥看来是没有睡醒(=_=)


healer_kx 2006-08-07
  • 打赏
  • 举报
回复
记住那句话的每一个字 "返回局部变量的指针或者引用",没有一个没有用的词汇.

第二个问题在于局部变量的声明周期结束,会dealloc它维护的堆指针而已.
这个是根本的原因.

healer_kx 2006-08-07
  • 打赏
  • 举报
回复
而且第一个是没有太大问题的,
所谓破坏虚表,那也是要在继承后才会出现的问题.
而虚表的内容确定是在Test::Test()之后的.
所以,第一个反而不会出问题.
healer_kx 2006-08-07
  • 打赏
  • 举报
回复
返回局部变量!
这是那门子错误啊? 这个回答so不准确了.

int a = 1;
return a; 这个返回局部变量有问题嘛?

jigangwang 2006-08-07
  • 打赏
  • 举报
回复
第一个写的不漏了一点.
直接定义对象到栈中.编译的时候已经确定了函数地址,和实现代码无关.
jigangwang 2006-08-07
  • 打赏
  • 举报
回复
第一个,只有是new出来的myClass才会core dump
因为只有指针才实现动态绑定,在运行的时候寻找函数入口,但是这个时候找不到析构函数地址,core了.编译的时候已经确定了函数地址,和实现代码无关.

第二个
string a = "abcd";
const char * b = fun(a.c_str());
这样的一个调用,将数据已经放入了常量数据区,而且常量数据区的数据在程序的整个运行期间都是有效的.所以认为第二个程序是没有问题的.
假如把const去掉就是错误的了.
playmud 2006-08-07
  • 打赏
  • 举报
回复
清除虚函数表和虚函数指针,我干吗非用new和delete.
haidaodiege 2006-08-07
  • 打赏
  • 举报
回复
唉,一群高人,自愧不如。
knowlove 2006-08-07
  • 打赏
  • 举报
回复
第一个,只有是new出来的myClass才会core dump
因为只有指针才实现动态绑定,在运行的时候寻找函数入口,但是这个时候找不到析构函数地址,core了.编译的时候已经确定了函数地址,和实现代码无关.

第二个
string a = "abcd";
const char * b = fun(a.c_str());
这样的一个调用,将数据已经放入了常量数据区,而且常量数据区的数据在程序的整个运行期间都是有效的.所以认为第二个程序是没有问题的.
假如把const去掉就是错误的了.
===========================================================================
to jigangwang(wang):
const 类型并不是真正的常量(局部),在整个运行期间有效?

mhzjy 2006-08-07
  • 打赏
  • 举报
回复
#include<string>
#include<stdio.h>
const char* fun( const char* _pSZ )
{
std::string sz( _pSZ );
sz += ".txt";
return sz.c_str();
}

struct node
{
const char* ptraddress;
char strcontent[100];
node* nextnode;
static unsigned long nodecounter;
};
unsigned long node::nodecounter = 0;
int main()
{
node* firstnode;
while(node::nodecounter<50)
{
char dir[100];
const char* p;
sprintf(dir,"%d",node::nodecounter);
node* currentnode = new node;
currentnode->nextnode = firstnode;
currentnode->ptraddress = fun(dir);
strcpy(currentnode->strcontent,currentnode->ptraddress);
firstnode = currentnode;
node::nodecounter++;
printf("%p %s %d\n",firstnode->ptraddress,firstnode->strcontent,node::nodecounter);
}
printf("\n\n");
while(node::nodecounter>0)
{
printf("%p %s %s %d\n",firstnode->ptraddress,firstnode->strcontent,
firstnode->ptraddress,node::nodecounter);
node* currentnode = firstnode;
firstnode = firstnode->nextnode;
delete currentnode;
node::nodecounter--;
}
return 1;
}

记录运行中 const char* fun( const char* _pSZ )这函数的返回地址的值和地址的内容
发现他一直是反回一个地址 所以就不算泄露吧??
当nodecounter数很大的时后那函数会返回两个地址。。。 神奇啊
healer_kx 2006-08-07
  • 打赏
  • 举报
回复
Sammy乱讲...
改为return sz.c_str(); //这个叫返回局部变量的指针?
langzi8818 2006-08-06
  • 打赏
  • 举报
回复
第一个是不是 memset( this , 0 , sizeof( myClass ) ) ;这里有问题。不能把整个类的内存都弄成零吧;
第二我很少用sting,是不是返回了局部变量
playmud 2006-08-06
  • 打赏
  • 举报
回复
UPCC兄,你错误的理解了偶得言语。
struct myClass
{
int m_a;

myClass(){ memset( this , 0 , sizeof( myClass ) ) ; }

virtual ~myClass(){};
};
从理论上来讲虚函数表是被清零了,但是依然能够正常析构。

下面的更恐怖:
#include <stdio.h>
#include <iostream>
struct T {
int m;

virtual ~T() { printf("base dtor\n"); }
};

struct T2 : public T {
virtual ~T2() { printf( "dvd dtor\n"); }
};

int main() {
T2 t;
printf( "&t: %p\n", &t );
printf( "&t.m: %p\n", &(t.m) );
memset((int *)(*((int *)&t)),0,4);
memset(((int *)&t),0,4);
return 0;
}
Dong 2006-08-06
  • 打赏
  • 举报
回复
昨晚一直回复不了这个问题,csdn挂了。

1,
破坏了virtual table,调用不到~myClass函数指针位置!对象不能正常析构
~myClass()是virtual,那么类在编译的时候会有一个virtual table来存放virtual functions的指针,memset后,指针相当与NULL了,那么就不能析构了!因为找不到析构的函数

(猪头的程序)
#include <iostream>
using namespace std;
struct myClass
{
int m_a;

myClass(){ memset( this , 0 , sizeof( myClass ) ) ; }
int print(){cout<<m_a<<endl;cout<<sizeof(myClass)<<endl;}
virtual ~myClass(){};
};

int main()
{
myClass x;
x.print();
x.~myClass();
return 0;

}

2,
返回局部变量!
a_b_c_abc10 2006-08-06
  • 打赏
  • 举报
回复
第一题 对象中有虚表,你却把它的虚函数指针设为0,动态绑定时就不能调用析构了。
第二题 函数返回时,sz对象要析构,sz.c_str();得到的指针已失效。
knowlove 2006-08-06
  • 打赏
  • 举报
回复
弱弱的问一句:
memset((int *)(*((int *)&t)),0,4);
memset(((int *)&t),0,4);
啥意思,这么复杂
vigorous001 2006-08-06
  • 打赏
  • 举报
回复
弄错了,Dev-C++下正常.
睡在床板下_ 2006-08-06
  • 打赏
  • 举报
回复
当我没说,实验 失败
加载更多回复(6)

65,189

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧