康斯特·查尔 * 变得腐败
Const Char * becoming corrupted
我有一个超类,它在其构造函数中为文本"V9k6FmI6Lw
"设置了一个const char *
成员。
但是,当子类读取此成员时,它最终会"org: 200201360210"
这是为什么呢?
程序代码:
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;
}
您的Super
构造函数通过复制获取JSON
,即在构造函数内部,您正在使用您在main()
中创建的对象的临时副本。然后,您将指向该临时字符串内的字符序列的指针存储,因此它本质上是指向临时堆栈变量的指针。构造函数完成后,JSON
和其中的string
已被销毁,留下一个指向 somwehere 的指针,即指向您不再拥有的一些 mfreed 内存。难怪下次你取消引用它时,那个位置还有其他东西,放在那里什么。
这种特殊情况下,您可以通过在两个构造函数中通过引用JSON
来解决此问题。但是,您必须确保Super
和Duper
对象的寿命永远不会超过构造它们的JSON
对象的寿命。如果他们这样做,则必须在其中存储JSON
或字符串的副本。
问题是,您正在按值传递 JSON 对象。因此,每次将 JSON 对象传递给 Duper 和 Super 的构造函数时,该对象都会被默认复制构造函数复制。因此,内部字符串成员也会被复制,并且指向字符串的指针与 main 方法中的指针不同。您可以通过引用传递 JSON 对象或使用 std::string 对象将字符串存储在 Super 中来处理此问题。
相关文章:
- 康斯特指针C++斯特劳斯特鲁普
- Static_cast 对于康斯特来说,会抛弃预选赛
- 东康斯泰克普/康斯蒂尼特/康斯特瓦尔在C++20 中允许吗?
- 康斯特正确性建议
- 从字符到康斯特* 字符的转换无效,代码有什么问题?
- T*上的部分排序...和康斯特·
- 梅森费尔托斯特种子作为成员变量
- 调用"树:<int>:运算符==(树*&<int><int>,树*&)康斯特"没有匹配函数
- 抛弃康斯特,就是这种定义明确的行为
- 错误:类型为 '.&' 来自类型的临时 '..*康斯特'
- 无法push_back移动(不可复制与康斯特字段)到矢量
- 传递康斯特字符*的值
- mpg123_open()和康斯特
- 康斯特指针浅拷贝
- C++ wifstream:不兼容的字符常量*,wchar_t康斯特*类型
- 康斯特是谎言吗?(因为康斯特可以被抛弃)
- 康斯特·查尔 * 变得腐败
- 康斯特查尔..改变
- 使用 32 位梅森费尔托斯特生成 64 位值
- 康斯特与 #define(奇怪的行为)