我想用
std::string
将 char*
转换为 size_t
并将结果存储在结构中。稍后我想再次检索 std::string 。不幸的是,当我稍后检索 std::string
或 char*
时,我总是得到第一个 char*
的未定义值(参见最小示例)。
这可能是什么问题?
#include <iostream>
#include <string>
struct Data {
Data(std::string string) : m_data(string.data()), m_size(string.size()) {
std::cout << "String size: " << m_size << std::endl;
std::cout << "String in constructor: ";
for (int j = 0; j < m_size; ++j) {
std::cout << (m_data)[j];
}
std::cout << std::endl;
}
char* m_data;
size_t m_size;
static void print_string(Data model_data) {
std::cout << "String in static function: ";
for (int j = 0; j < model_data.m_size; ++j) {
std::cout << model_data.m_data[j];
}
std::cout << std::endl;
}
};
int main() {
std::string test_string = "Hello World! The next characters might appear...";
Data test_data(test_string);
Data::print_string(test_data);
std::cout << "String from member: ";
for (int j = 0; j < test_data.m_size; ++j) {
std::cout << test_data.m_data[j];
}
return 0;
}
String size: 48
String in constructor: Hello World! The next characters might appear...
String in static function: �~v��� next characters might appear...
String from member: �~v��� next characters might appear...%
在你的构造函数中:
Data(std::string string) : m_data(string.data()), m_size(string.size())
您创建一个复制对象
string
,其生命周期在构造函数主体结束时结束。因此 m_data
指的是之后释放的内存,并且读取它是未定义的行为。您可以通过将 std::string
替换为对字符串对象的(常量)引用来轻松解决此问题:
Data(const std::string& string)
但是只有当您可以确保传入的
string
对象的生命周期超过 Data
对象生命周期 时,这才有效