为什么我可以分配一个对象数组,但不能将它们放在向量中
Why can I allocate an array of objects but not put them in a vector?
>我有一个类,我想包含我创建的东西的多个对象。现在有效的代码是:
过程.h:
private:
myObj *data;
process.cc:
data = new myObj[10];
但是,我想将一个值传递给构造函数,因此我尝试将其转换为 std::vector(在修改构造函数以获取值之后)。
过程.h:
private:
std::vector<myObj> data;
process.cc:
for (int m=0; m<10; m++) data.push_back( myObj(1.2) );
当我尝试它在执行时崩溃时
*** glibc detected *** ... corrupted double-linked list: ... ***
gdb 中的回溯显示析构函数中出现错误,当我尝试为我分配的其他数组释放一些内存时。搜索没有显示任何明显的东西。我在myObj
中使用了一些静态成员变量,这可能是一个问题吗?
您遇到双重删除错误。考虑这个简单的例子:
struct Other {};
struct MyObj {
Other *p;
MyObj () : p(new Other) {}
~MyObj () { delete p; }
};
std::vector<MyObj> data;
data.push_back(MyObj());
推送到data
上的临时对象将正确存储。但是,由于它是临时的,因此在推送后立即被销毁。这意味着,当临时成员被销毁时,p
成员将被删除,因此向量的副本版本有一个悬空指针。销毁矢量对象后,指针将再次被删除,从而导致堆损坏。您收到的错误消息来自抱怨结果错误状态的glibc
代码。
若要解决此问题,应定义适当的复制构造函数,以将对象的所有权从临时对象传递到目标。三法则说我们也应该定义赋值运算符。
struct MyObj {
mutable Other *p;
MyObj () : p(new Other) {}
MyObj (const MyObj &o) : p(o.p) { o.p = 0; }
~MyObj () { delete p; }
const MyObj & operator = (MyObj o) {
using namespace std;
swap(*this, o);
return *this;
}
};
当实例被const
时,需要使用可变对象才能修改p
成员,并且需要const
,因为临时变量正在传递给复制构造函数。通过此更改,将项目推送到矢量中可以正常工作。
更好的解决方案是定义p
改用unique_ptr
。
struct MyObj {
std::unique_ptr<Other> p;
MyObj () : p(new Other) {}
};
此示例中不需要析构函数,因为默认析构函数将破坏 p,这将导致Other
实例被 unique_ptr
删除。
您正在尝试使用向量在一个类中存储多个对象?我也遇到了这个问题,我解决这个问题的唯一方法是将您使用向量的函数放在标题中。我相信正在发生的事情是你为向量提供了一个类型,在本例中是myObj,但.cpp看不到你把向量定义为什么类型。因此,将函数粘贴在标头中似乎可以解决它。我相信还有其他方法可以解决这个问题,但我没有深入研究这个问题。
示例代码:
class A
{
private:
vector<myObj> data;
public:
A();
~A();
printData()
{
for(int i = 0; i < data.size(); i++)
{
printf("X position: %.2f Y position: %.2f Z position: %.2f n", data.at(i).x, data.at(i).y, data.at(i).z);
}
};
}
这可能是问题所在,或者,这是您的命名约定。我不确定你在做什么,但数据如何 *myObj;和数据 = 新的 myObj[10];真的有效吗?难道不是myObj =新数据[10]吗?如果是这样,那么您的向量将是:
vector<data> myObj;
- 是否可以将函数导入命名空间,但不能导出它?
- std::unique_ptr 在 GCC 中工作,但不能在 Visual Studio 中编译
- 声明C++具有动态大小的数组类型在 Linux 中工作正常,但不能在 Windows 中工作
- 为什么我可以隐式地将字符*转换为常量字符*,但不能将无符号字符*
- std::chrono::d uration 可以按秒初始化,但不能按毫秒初始化?
- Python/C++:可以导入犰狳(arma::)但不能导入子程序arma::arma_rng::randn
- 为什么我可以从C++文件中读取 int 值,但不能浮点?
- C++程序在将 int 与 cin 一起使用时有效,但不能使用字符串
- SqLite c++,可以创建数据库,但不能将 anthing 插入到表中
- std::remove() 按预期处理文字,但不能与取消引用的迭代器一起工作
- 16 位系统中的程序如何访问大于 65535 的整数,但不能访问地址
- C++:返回本地对象,但不能正常工作
- 可以访问一个类中的播放器结构,但不能访问另一个类中的播放器结构
- 返回实例变量的c++方法可以访问变量中的数据,但不能更改它,但在编译时不会生成错误
- 用C++替换std::字符串中的一个子字符串,但不能全部替换
- C++11 向量包含 2 个不同的子类,但不能同时进行
- 仅叮当:一对<路径,路径>可以放入向量中;一对也可以<unique_ptr,unique_ptr>;但不能成对<路径,unique_ptr>:为什么?
- 为什么我可以分配一个对象数组,但不能将它们放在向量中
- c++声明向量数组以获取类,但不能访问成员变量
- 创建了我自己的向量类.可以重载流运算符,但不能按值c++打印