由于析构函数,无法返回函数中的对象向量



我在函数中返回类的对象向量时遇到了一些问题,因为每次我的析构函数擦除数据两次,而当函数结束时,所有代码都会失效

这里有一个简单的代码,我写的只是为了显示我的问题:

#include <iostream>
#include <vector>
using namespace std;
class identity{
public:
string name;
identity(string Name);
~identity();
};
vector<identity> function();
int main(){
function();
cout << "Hello world!";
}
identity::identity(string Name)
: name{Name}{
cout << "Object created!" << endl;
}
identity::~identity(){
cout << "Object " << name << " destroyed!" << endl;
}
vector<identity> function(){
identity me("Isaias");
}

在这种情况下;你好世界"不起作用并且程序总是以";对象";而不显示这样的名称:

Object created!
Object Isaias destroyed!
Object

然后程序就停止了。我通过将函数的类型设置为";"无效";或任何其它代替";矢量";但我想知道为什么会出现这个问题。此外,我对编程和这个社区都是新手,所以如果我做这件事的方式不对,我很抱歉。

在做任何事情之前,我要感谢大家的关注,如果我把这里的一切都搞砸了,我再次感到抱歉。

vector<identity> function(){
identity me("Isaias");
}

程序的行为是未定义的,因为即使您已经声明函数返回vector<identity>,也不会从函数返回任何内容。

要修复错误,请返回一个值。示例:

using namespace std::string_literals;
return {"Isaias"s};

另一个错误是您选择使用using namespace std,但您声明了identity,这是一个已经在std命名空间中的标识符。这使得程序变得模糊不清,格式不正确。

要解决此问题,请为类选择另一个名称,这样该名称就不会与std命名空间中的任何当前或未来名称冲突。这是非常困难的,因为std中有很多名称,您无法预测未来。不过,还有一个更简单的解决方案!只是不要使用using namespace std


第三个错误是,您使用了std::string,但没有包含定义它的头。结果是,该程序可能不一定以任何当前或未来的语言实现进行编译。

解决方案:包括标题<string>

最新更新