gpt4 book ai didi

c++ - 如何将 std::string 作为构造函数参数传递并将其保存的 C 字符串存储在 void 指针中?

转载 作者:行者123 更新时间:2023-11-30 03:22:47 24 4
gpt4 key购买 nike

我有一个构造函数,它接受对 std::string 对象的 const 引用,并且应该存储 std::string void 指针成员变量中的内部 C 字符串。但是,当使用 void 指针时,我的程序会出现段错误,并且 gdb 表示该指针指向地址 0x01。这是我的来源:

Foo.h:

class Foo {
public:
Foo(const std::string& str);
void* getData();

private:
Foo(void* newData);
void* data;
};

Foo.cpp:

Foo::Foo(const std::string& str)
: Foo(str.c_str())
{
//nothing
}

void* Foo::getData() {
return data;
}

Foo::Foo(void* newData)
: data(newData)
{
//nothing
}

主要.cpp:

int func(void* data);

int main() {
Foo f("bar");

func(f.getData()); //segfault here

return 0;
}

int func(void* data) {
std::string str = (char*)data;
std::cout << str << std::endl;

return 0;
}

最佳答案

当您调用f.getData() 时,由"bar" 构造的字符串不再存在,因此指向其内部字符数组的指针不再有效.该字符串只是为函数调用而构建,并在 main 函数的其余部分执行之前再次被破坏。当您取消引用无效指针时会发生段错误。

请尝试以下操作:

const std::string str("bar");
Foo f(str);

这样,当需要数据时,字符串仍在范围内。


除此之外,整体方法是不可取的。如果可能,最好不要使用 void* 指针和原始指针,或者至少在一个对象内安全地管理它们。您的问题已经很清楚为什么这种指针使用不安全且容易出错。

关于c++ - 如何将 std::string 作为构造函数参数传递并将其保存的 C 字符串存储在 void 指针中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50824153/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com