【问题标题】:Initializing vector of objects fail due to pointer being freed was not allocated ERROR [duplicate]由于未分配指针而导致对象的初始化向量失败 [重复]
【发布时间】:2018-10-21 12:40:24
【问题描述】:

下面是我创建的示例类,都需要创建下面类的对象向量

#include <stdio.h>
#include "myvector.h"
#include <iostream>

class myvector
{
private:
  double *elem;
  int sz;

public:
  myvector()
  {
    std::cout << " In Constructor \n";
  }

 ~myvector()
 {
   std::cout << " In Destructor \n";
   delete[] elem;
 }

 myvector(int s)
 {
   std::cout << " In Param Cons \n";
   elem= new double[s];
 }
 myvector::myvector(const myvector& that)
 {
    this->sz=that.sz;
    this->elem=that.elem;
 }

myvector&  operator=(const myvector& that)
{
  return *this;
}
};

下面是主要功能

#include <iostream>
#include "myvector.h"
#include <vector>

int main(int argc, const char * argv[]) {
// insert code here...
 myvector abc(10);
 std::vector<myvector> abc(10,10);
 getchar();
 return 0;
}
myvector abc[10];  works perfectly and creates an array of objects

但是因为我需要为我在下面使用的所有这些对象调用参数构造函数

std::vector abc(10,10);

这实际上不是在创建数组,而是因为错误而失败

vector(16828,0x10013e380) malloc: * 对象 0x100400050 的错误:未分配被释放的指针 * 在 malloc_error_break 中设置断点进行调试

参数函数甚至没有被调用 10 次,它只被调用了一次

【问题讨论】:

  • 当然,我读过它,但我知道为什么我需要复制构造函数吗?因为我没有复制任何东西,系统是否会为任何操作调用 copy con,如果是,那可能是什么?你的解释会很有帮助
  • 我建议你把myvector的构造函数explicit。然后你会开始注意到你在哪里创建了需要复制的对象。
  • 添加了复制构造函数和赋值运算符,它们也可以工作。
  • 仅仅添加它们是不够的(编译器已经合成了它们)。他们需要做正确的事。你的并不比编译器生成的好。考虑阅读how to debug small programs

标签: c++ c++11


【解决方案1】:

这是一个传统问题,因为您正在复制对象但您的类不是复制安全的。

如果您将数据复制到另一个容器并被销毁,会发生什么情况?双倍免费。不能有拷贝构造函数,应该是= delete

如果您使用 C++ 良好实践并使用以下方法,这将是显而易见的:

std::unique_ptr<double[]> elements;

而不是手动内存管理(你现在是 C++11,而不是 C++03,你不应该再显式删除任何东西)。

【讨论】:

  • 当然,但是这个 std::vector abc(5,10);仍然颂歌没有创建我的向量的 5 个对象,它只是调用参数构造函数一次。我在这里遗漏了一些东西,但找不到什么
  • @LearningCpp 它正在创建一个对象,并将其复制到其他对象。
  • 谢谢,我从来没有意识到它的发生,也从来没有遇到过这个问题,在以前版本的 c++ 中是如何处理的,即 90 年代
  • 您将在复制构造函数中分配新数据。当然,这仍然是您可以做的。
猜你喜欢
  • 1970-01-01
  • 2019-10-04
  • 2016-03-26
  • 1970-01-01
  • 2014-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多