C++ C++;:试图通过指针和函数复制类时出现分段错误

C++ C++;:试图通过指针和函数复制类时出现分段错误,c++,C++,代码最后一步的目标是创建类的临时实例,在类的私有数据成员上使用集合,在实例仍在范围内时打印出实例,然后使用负责指针和类实例的析构函数。我得到了分割错误,我已经得到了一段时间,即使有很多变化,所以它让我非常沮丧 #include <cstdlib> #include <iostream> #include <cstring> using namespace std; //Class Definition class Box{ //Pr

代码最后一步的目标是创建类的临时实例,在类的私有数据成员上使用集合,在实例仍在范围内时打印出实例,然后使用负责指针和类实例的析构函数。我得到了分割错误,我已经得到了一段时间,即使有很多变化,所以它让我非常沮丧

 #include <cstdlib>
 #include <iostream>
 #include <cstring>

using namespace std;


//Class Definition

class Box{

      //Private data members
      private:
      int height;
      int width;
      int depth;
      char *name;
      void pri_setname(char *n);

      public:
      //Public constructors and deconstructor
      Box(int,int,int,char *);
      Box(const Box &obj);
      ~Box();
      //Public function prototypes
      void width_set(int w);
      void height_set(int h);
      void depth_set(int d);
      void name_set(char *n);
      void name_print();
      int volume_print();
      void objCreateKeep(Box **, char *n);
      void objCreateTmp(char *n);
};

//Default constructor
Box::Box(int h1 = 1,int w1 =1, int d1 =1,char *n1 = "Blue Box")
{
  strcpy(name,n1);
  height = h1;
  width = w1;
  depth  = d1;

}
//Copy constructor
Box::Box(const Box &obj)
{
  name = new char[25];
  strcpy(name,obj.name);
  height = obj.height;
  width = obj.width;
  depth = obj.depth;
}
//Destructor
Box::~Box()
{
  delete [] name;
  cout<<"Destructor invoked, name pointer is deallocated";
}

void Box::pri_setname(char *n)
{
   strcpy(name,n);  
}

//Set the width of Box()
void Box::width_set(int w)
{
     width = w;
}

//Set the height of Box()
void Box::height_set(int h)
{
     height = h;
}

//Set the depth of Box()
void Box::depth_set(int d)
{
     depth = d;
}

//Set the name of Box()
void Box::name_set(char *n)
{
    name = new char[30];
    strcpy(name,n);
    pri_setname(name);
}

//Prints the name of the box
void Box::name_print()
{
  cout<<"Box Name: "<<name;
}

//Calculate and Print volume of Box()
int Box::volume_print()
{
   int volume = 0;
   volume = height * width * depth;
   return volume ;
}


void Box::objCreateTmp(char *n)
{
   Box tmp;
   tmp.name_set(n);
   tmp.name_print();
   tmp.~Box();
}

void Box::objCreateKeep(Box **pp, char *n)
{
  Box *p = new Box;
  pp = &p;
  p->objCreateTmp(n);
  delete p;
}


int main(int argc, int argv[])
{

    //Check for correct # of cmd line args
    /*
    if(argc != 3)
    {
      cout<<"Wrong number of arguments";
    }
    */
/*
    Box a;
    a.height_set(argv[1]);
    a.width_set(argv[2]);
    a.depth_set(argv[3]);

    Box b = a;
    Box c = a;

    //Set the names of box B and C
    b.name_set("Red Box");
    c.name_set("Orange Box");

    a.name_print();
    b.name_print();
    c.name_print();


*/
    Box *keep;
    Box **pp;

    keep->objCreateKeep(pp,"Blue Box");
    keep->objCreateKeep(pp,"Red Box");
    keep->objCreateKeep(pp,"Orange Box");


    system("PAUSE");
    return(0);
}
#包括
#包括
#包括
使用名称空间std;
//类定义
类框{
//私有数据成员
私人:
内部高度;
整数宽度;
智力深度;
字符*名称;
void pri_setname(char*n);
公众:
//公共构造器与解构器
框(int,int,int,char*);
盒子(const盒子和obj);
~Box();
//公共功能原型
空隙宽度(int w);
空隙高度(int h);
空隙深度_集(int d);
无效名称集(字符*n);
无效名称_print();
int volume_print();
void objCreateKeep(方框**,字符*n);
void objCreateTmp(字符*n);
};
//默认构造函数
盒子:盒子(inth1=1,intw1=1,intd1=1,char*n1=“蓝色盒子”)
{
strcpy(名称,n1);
高度=h1;
宽度=w1;
深度=d1;
}
//复制构造函数
盒子::盒子(const盒子和obj)
{
名称=新字符[25];
strcpy(名称、对象名称);
高度=物体高度;
宽度=对象宽度;
深度=对象深度;
}
//析构函数
盒子::~Box()
{
删除[]名称;

cout除了这里的其他答案外:

tmp.~Box();
-否

析构函数在超出范围时被调用

delete [] name;
在析构函数中调用,现在将调用两次。错误。

行中

pp = &p;
您将
p
地址分配给
pp

当你
delete
p时,记住它的位置并不重要

p->objCreateTmp(n);
delete p;

>keep->objCreateKeep(pp,“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;现在我有了你的信用卡详细信息。故事的寓意:不要使用strcpy。停止。不。不要。永远不要。你甚至还没有按new分配
keep
!!,你不能使用it@billz-我认为你抓住了主要问题-但正如你从其他评论/答案中看到的,这段代码可能需要大量修复…@Floris我知道这就是为什么我没有这么做抱歉,我知道这段代码乱七八糟。如果最初的错误没有让我确信我所做的是完全错误的。我非常感激能得到的任何帮助。在某个时候,我离解决方案更近了,然后我开始出现这个错误,更改了很多内容,增加了很多混乱。调试器没有帮助,并且我不知道从最初的错误开始我犯了多少错误。它是编译的,运行时不是很多。你知道如何使用
-g
编译和使用
gdb
吗?这可能是一个很好的开始。另一件事是-去掉“一切”从尽可能小的问题开始;让它开始工作,然后从那里开始构建。在你的情况下——试着创建一个对象,没有什么特别之处。正如@billz指出的那样——你甚至不能调用你的第一个方法,因为
keep
没有初始化。从那里开始,采取一些步骤。这是最初的错误,我没有意识到我对析构函数意味着它将被使用两次。