Const Char *被破坏了

时间:2013-10-04 08:37:09

标签: c++

我有一个超类,它在其构造函数中将const char *成员设置为文本“V9k6FmI6Lw”。

但是当子类读取此成员时,它最终为"org: \200\201\360\210"

这是为什么?

程序代码:

Struct Json {
   std::string objectId;
}

class Super {

     const char * objectId;

  Super( Json value) {
      objectId = value.objectId.c_str();
  }
}

class Duper : public Super {
   Duper (Json value) : Super(value) {
   }

   void doSomething() {
      std::cout << "Object Id is : " << objectId;
   }
}

int main (){
   Json value { "V9k6FmI6Lw" };

   Duper object(value);
   object.doSomething();
   return 0;
}

2 个答案:

答案 0 :(得分:1)

您的Super构造函数需要JSON副本,即在构造函数内使用您在main()内创建的对象的临时副本。然后,您将该指针存储在该临时字符串内的字符序列中,因此它实际上是指向临时堆栈变量的指针。构造函数完成后,其中的JSONstring已被销毁,留下指向 somwehere 的指针,即指向某些mfreed内存,您不拥有任何内容更多。难怪下次你取消引用它时,那个位置还有其他东西,无论放在那里。

在这种特殊情况下,你可以通过在两个构造函数中引用JSON来解决这个问题。但是,您必须确保SuperDuper对象永远不会超过构造它们的JSON对象。如果他们这样做,您将必须存储JSON的副本或其中的字符串。

答案 1 :(得分:1)

问题是,你是按值传递JSON对象的。因此,每次将JSON对象传递给Duper和Super的构造函数时,对象都会被默认的复制构造函数复制。因此,内部字符串成员也会被复制,并且指向字符串的指针与main方法中的指针不同。您可以通过引用传递JSON对象或使用std :: string对象将字符串存储在Super中来处理此问题。

相关问题