源码1000多行,我就不翻了,我专门构造了一个我感兴趣的类似案例,关注源码:
#include <iostream>
using namespace std;
class Person
{
public:
Person();
Person(char*);
~Person();
Person& operator=(const Person&);
friend Person& example(const Person&);
void print() const;
private:
char* name;
};
Person::Person()
{
name = new char[12];
name = "Temp";
}
Person::~Person()
{
delete[] name;
}
Person::Person(char* _name)
{
name = new char[strlen(_name)+1];
strcpy_s(name,strlen(_name)+1,_name);
}
Person& example()
{
char* TestName = new char[11];
TestName = "ShouldStay";
Person B(TestName);
return B;
}
void Person::print() const
{
cout << name;
}
int main()
{
example();
return 0;
}
在这种情况下,example() 函数将返回:
- example returned {name=0x007cad88 "îþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþ... } Person &
很明显,析构函数在 return 命令上被调用并删除了堆中的内存(所以我无法对指针做任何进一步的事情——它指向已经释放的内存——没有数据)。
我的问题是 - 如何避免这种行为?避免此类问题的最优雅方法是什么?
提前致谢!
最佳答案
- 使用
string
而不是char[]
以避免不得不使用new
。 - 返回
Person
而不是Person&
,作为局部范围的类 离开作用域后被销毁。虽然这会导致 复制发生取决于编译器设置。这当然取决于提供适当的复制构造函数。 为保证避免复制,将
example
的签名更改为:void example(Person& person)
并在函数内填写输入人的字段。该
Person
的范围将绑定(bind)到调用范围(或您构造它的任何其他地方)。尽管此方法有缺点,例如您无法将结果链接在一起。
关于C++ 如何在类函数中构造一个对象,执行一些操作并返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22823925/