const char* 与 string 转换的问题

问题描述:std::string类型数据通过data()方法转成const char*之后出现乱码。

  1. 在QT界面的构造函数MainWindow中创建了一个class A对象m_a(classA 传入参数1是string类型,通过string的data赋值给A::m_p1)。此时查看m_a里的m_p1的值是正常的。如下:

    img

  2. 此时我按了QT界面上的按钮,进入 on_pushButton_clicked槽函数,此时再次查看m_a里的m_p1的值出现了乱码。如下:

    img

请问各位,这是哪里出了问题?

详细代码如下:

#include<string>
using namespace std;
class A
{
public:
    A(string p1,char *p2){m_p1=p1.data();m_p2=p2;}
private:
    const char *m_p1;
    const char *m_p2;
};
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "a.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    A *m_a;
private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    m_a = new A("hello world","hello world");
}
void MainWindow::on_pushButton_clicked()
{

}

string::data()或string::c_str()返回的是const char*类型数据。
若string内容发生改变,得到的结果也会发生改变。
所以一般情况下不能长期使用string::data()或string::c_str()生成的指针,应该使用strcpy将内容拷贝到自建内存中。

把data换成c_str()