gpt4 book ai didi

c++ - 在 C++ 类中修改指向 std::string 的指针

转载 作者:太空狗 更新时间:2023-10-29 23:45:00 30 4
gpt4 key购买 nike

我刚开始学习 C++,一方面使用 gnu 编译器,另一方面使用 Visual C++Intel,遇到了不一致的问题另一方面,编译器。以下示例定义了一个类 Person,它带有指向 std::string Name 的指针。在方法 Person::set 中,字符串是按值分配的。我确信更好的方法是使用指针,但这不是这里的问题。

#include <iostream>
#include <string>

class Person
{
std::string *Name;
public:
Person(std::string *n); //Constructor
void print();
void set(std::string n);
};

Person::Person(std::string *n) : Name(n) //Implementation of Constructor
{
}

// This method prints data of person
void Person::print()
{
std::cout << *Name << std::endl;
}


void Person::set(std::string n)
{
Name = &n;
}

int main()
{
std::string n("Me");
std::string n2("You");
Person Who(&n);

Who.print();
Who.set(n2);
Who.print();


return 0;
}

gnu 编译器给出了我预期的以下结果:

Me
You

但是 Visual C++Intel 编译器会导致未定义的行为。我猜问题出在 Person::set 中复制的变量 n 的生命周期。为什么在使用 gnu 编译器完成 Person::set 后仍然可用,而使用 Visual C++Intel 则不可用编译器?

最佳答案

您的 Set 方法正在为您设置未定义的行为,因为您正在获取局部变量的地址,然后在另一个范围内使用它:

void Person::set(std::string n)
{
Name = &n; // n is a local variable
}

任何在 Person::set 之外取消引用 Name 的尝试,就像您在 Person::print() 中所做的那样,是未定义的行为

您尝试过的所有编译器的行为都与未定义的行为兼容,因为一切都是。

关于c++ - 在 C++ 类中修改指向 std::string 的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23424061/

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