结构或类中的字符串到 char* 转换给出未定义的第一个字符

问题描述 投票:0回答:1

我想用

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...%
c++ string pointers char
1个回答
0
投票

在你的构造函数中:

Data(std::string string) : m_data(string.data()), m_size(string.size())

您创建一个复制对象

string
,其生命周期在构造函数主体结束时结束。因此
m_data
指的是之后释放的内存,并且读取它是未定义的行为。您可以通过将
std::string
替换为对字符串对象的(常量)引用来轻松解决此问题:

Data(const std::string& string)

但是只有当您可以确保传入的

string
对象的生命周期超过
Data
对象生命周期

时,这才有效
© www.soinside.com 2019 - 2024. All rights reserved.