gpt4 book ai didi

c++ - 在赋值运算符之前调用结构的析构函数

转载 作者:太空宇宙 更新时间:2023-11-03 10:28:18 24 4
gpt4 key购买 nike

我有一个结构体 Foo,它有一个指针数组 Bar。

struct Foo
{
Bar* _BarList;

Foo()
{
_BarList = new Bar[1];
_BarList[0] = Bar(10, 20);
}

Foo& operator=(const Foo& foo)
{
Bar* tmpBarList = new Bar[1];

tmpBarList[0] = foo._BarList[0];

delete[] _BarList;

_BarList = tmpBarList;

return *this;
}

~Foo()
{
delete[] _BarList;
}
};

我是这样调用它的

Foo baz = fooFunc();

(看起来)如果我在函数 (fooFunc) 中创建 Foo (f) 的实例并返回它,则在返回值之前调用析构函数,因为我丢失了 _BarList 的内容。

这是有道理的,因为它是在函数内创建的。这是一个例子。

Foo fooFunc()
{
Foo f = Foo();
return f;
}

如果我在返回时直接返回 Foo 的一个实例,则直到调用了等于运算符(通过调用行上的 equals 语句)之后,才会调用该项目的析构函数。

Foo fooFunc()
{
return Foo();
}

我想这是有道理的,因为我在对象内部创建了 Foo,并且在返回对象之前清除了所有内容。

我想我可以通过像这样返回来解决这个问题(在编写一个新的构造函数来获取 Foo 之后):

Foo fooFunc()
{
Foo f = Foo();
return Foo(f);
}

1) 我的假设是否正确?

2) 是否有另一种不需要调用那么多重复赋值运算符的方法?

编辑:请考虑这个函数通常会做的不仅仅是 return Foo()!

最佳答案

你的类(class)违反了Rule of three .您有一个析构函数和一个复制赋值运算符,但没有复制构造函数。而默认设置绝对不会满足您的需求。

请注意所有这些行:

Foo f = Foo();
return Foo(f);
Foo baz = fooFunc();

使用复制构造函数,而不是赋值运算符。赋值运算符仅用于对现有对象进行赋值,从不用于创建/初始化新对象。

关于c++ - 在赋值运算符之前调用结构的析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26156837/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com