- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个结构体 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/
我开始考虑在我 future 的项目或重构中实现控制反转容器,我想知道在正确设计依赖项时哪些原则(除了 GoF 模式)可能需要牢记在心。假设我需要构建一个简单的控制台应用程序,如果它可以访问互联网,它
假设我有一个 RxC contingency table 。这意味着有 R 行和 C 列。我想要一个维度为 RC × (R + C − 2) 的矩阵 X,其中包含行的 R − 1 “主效应”以及列的
我正在尝试使用 DKMS 为正在运行的内核 (4.4) 构 build 备树覆盖。我天真的 Makefile 如下: PWD := $(shell pwd) dtbo-y += my-awsome-o
我有一个 sencha touch 项目。我是用 phonegap 2.9 构建的,并且可以正常工作 device.uuid 返回到设备 ID。当我尝试使用 3.1 device.uuid 构建时抛出
我在安装了 Xcode 4.5.1 的 Mt Lion 上运行。 默认情况下,当我构建并部署到 iOS 5.1 设备时,显示会在我旋转设备时旋转,但当我部署到 iOS 6 模拟器或运行 iOS 的 i
我正在尝试使用 Google Analytics Reporting API v4 构建多折线图。 一张图表,其中我按每天的 session 计数为每个设备(台式机/平板电脑/移动设备)设置了一条线。
我一生都无法使用 xcode 组织者“自动设备配置”中的“团队配置配置文件”在 xcode 4.0.1 中将我的应用程序构建到我的 iPad 上。 该应用程序完美地构建到模拟器,但当我构建到 iPad
我是一名优秀的程序员,十分优秀!