-3

我有一个超类,它在其构造函数中将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;
}
4

2 回答 2

1

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

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

于 2013-10-04T09:11:00.803 回答
1

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

于 2013-10-04T09:12:39.577 回答