关于C++中const & 返回类型的一些看法
2009-11-26 14:58
573 查看
看下面这段代码
class CPEntry{
public:
char *m_pName;
~CPEntry()
{
if (NULL != m_pName)
{
delete m_pName;
}
}
};
class A
{
public:
CPEntry m_Entry;
const CPEntry & GetObject()
{
return m_Entry;
}
};
int main()
{
A test;
test.m_Entry.m_pName = new char[20];
sprintf(test.m_Entry.m_pName, "%s", "this is ok");
printf("%s", test.m_Entry.m_pName );
CPEntry temp = test.GetObject();
printf("%s", test.m_Entry.m_pName );
return 0;
}
上面的这段代码在编译时没有任何的警告,运行时也不会出现问题。但当CPEntry有一个指针类型的变量时就可能会引发无效指针问题。
再看下面这段代码: class CPEntry{
public:
char *m_pName;
~CPEntry()
{
if (NULL != m_pName)
{
delete m_pName;
}
}
};
class A
{
public:
CPEntry m_Entry;
const CPEntry & GetObject()
{
return m_Entry;
}
};
int main()
{
A test;
test.m_Entry.m_pName = new char[20];
sprintf(test.m_Entry.m_pName, "%s", "this is ok");
printf("%s", test.m_Entry.m_pName );
{
CPEntry temp = test.GetObject();
}
printf("%s", test.m_Entry.m_pName );
return 0;
}
注意看printf("%s", test.m_Entry.m_pName ); {
CPEntry temp = test.GetObject();
}这段代码,temp出了作用域被释放,CPEntry的指针被删除,所以再次使用会发生崩溃。这是在实际工作中遇到的一个问题,用了几个小时去调这个BUG。
class CPEntry{
public:
char *m_pName;
~CPEntry()
{
if (NULL != m_pName)
{
delete m_pName;
}
}
};
class A
{
public:
CPEntry m_Entry;
const CPEntry & GetObject()
{
return m_Entry;
}
};
int main()
{
A test;
test.m_Entry.m_pName = new char[20];
sprintf(test.m_Entry.m_pName, "%s", "this is ok");
printf("%s", test.m_Entry.m_pName );
CPEntry temp = test.GetObject();
printf("%s", test.m_Entry.m_pName );
return 0;
}
上面的这段代码在编译时没有任何的警告,运行时也不会出现问题。但当CPEntry有一个指针类型的变量时就可能会引发无效指针问题。
再看下面这段代码: class CPEntry{
public:
char *m_pName;
~CPEntry()
{
if (NULL != m_pName)
{
delete m_pName;
}
}
};
class A
{
public:
CPEntry m_Entry;
const CPEntry & GetObject()
{
return m_Entry;
}
};
int main()
{
A test;
test.m_Entry.m_pName = new char[20];
sprintf(test.m_Entry.m_pName, "%s", "this is ok");
printf("%s", test.m_Entry.m_pName );
{
CPEntry temp = test.GetObject();
}
printf("%s", test.m_Entry.m_pName );
return 0;
}
注意看printf("%s", test.m_Entry.m_pName ); {
CPEntry temp = test.GetObject();
}这段代码,temp出了作用域被释放,CPEntry的指针被删除,所以再次使用会发生崩溃。这是在实际工作中遇到的一个问题,用了几个小时去调这个BUG。
相关文章推荐
- 关于Column '*' not found 解决方案 Hibernate使用SQL查询返回实体类型,即返回某个类,或实体类
- 关于c++ 强制转换类型运算符 static_cast、dynamic_cast、reinterpret_和const_cast
- C++中关于&的一些。int i 与 int &i 注意事项
- 关于嵌入式C&&C++的一些编程问题(一)
- C++中关于类型的一些术语
- C++ 关于static_cast reinterpret_cast dynamic_cast 以及 const_cast 用于类型转换的函数使用 20180315 day7
- c++中的一些类型转换 : CString,string,int ,long,double,char*,const char*,date等
- 关于C++中const的一些介绍
- const、&在定义函数返回的作用及接收返回变量的类型
- c和c++关于const的一些区别
- 关于C++ const成员的一些细节
- 关于C++中const的一些总结
- c++ lambda返回类型自动推导的一些需要注意的地方
- 关于嵌入式C&&C++的一些编程问题(二)
- 关于“Error: "const char *" 类型的实参与 "LPCWSTR"类型的形参不兼容”错误的解决方案
- c/c++: c++函数返回类型什么情况带const
- c和c++关于const的一些区别
- c++中关于const的一些细节问题
- 【C++错误处理】VC6中关于bool __cdecl std::isdigit(_E,const class std::locale &)' : expects 2 arguments
- c++中的一些类型转换 : CString,string,int ,long,double,char*,const char*,date等----留着备用