Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重载运算符[]时返回的堆栈内存地址_C++_Char_Operator Overloading - Fatal编程技术网

C++ 重载运算符[]时返回的堆栈内存地址

C++ 重载运算符[]时返回的堆栈内存地址,c++,char,operator-overloading,C++,Char,Operator Overloading,对于类中的一个问题,我遇到了一些重载[]运算符的问题。这是用于重载的函数: const char* Person::operator[](const char* str) { if (strcmp(str, "name") == 0) return reinterpret_cast<const char *>atoi(name); if (strcmp(str, "age") == 0) {

对于类中的一个问题,我遇到了一些重载[]运算符的问题。这是用于重载的函数:

const char* Person::operator[](const char* str)
{
    if (strcmp(str, "name") == 0)
        return reinterpret_cast<const char *>atoi(name);

    if (strcmp(str, "age") == 0)
    {
        char temp[4];
        _itoa(age, temp, 10);
        //cout << temp;
        return temp;
    }
}
我遇到的问题是
返回温度行。CLion返回以下警告:
与返回的局部变量“temp”关联的堆栈内存地址


果然,当尝试使用运算符时,返回的值是内存地址。我怎样才能着手解决这个问题?它与函数的返回类型有关吗?

您将一个地址带到一个临时地址(位于堆栈上),该地址将使返回的指针几乎立即悬空

<>我强烈建议使用<代码> STD::string < /COD>字符串,不要用C++编写C++类。

然后在此处按值返回by
std::string
。糟糕的类C方法是在堆上分配字符串并返回它,最好至少作为
std::unique_ptr
返回

在下面的注释后编辑: 由于需要将整数转换为字符串并返回值,因此不能返回临时变量,因此结果必须比方法更有效。基本上有两个坏的选择:

  • 使
    temp
    为静态,这样指针保持有效。缺点是该功能不再是可重入者。这样更安全,因为它不会泄漏
  • 返回堆分配的字符串。最大的危险是,您将让用户取消分配它:
  • 我相信您的代码中也有输入错误:

    return reinterpret_cast<const char *>atoi(name);
    
    返回重新解释卡斯塔托(姓名);
    

    atoi
    不应该在那里,对吗?
    reinterpret\u cast
    不应该被需要。

    您将一个地址带到一个临时地址(位于堆栈上),该地址将使返回的指针几乎立即悬空

    <>我强烈建议使用<代码> STD::string < /COD>字符串,不要用C++编写C++类。

    然后在此处按值返回by
    std::string
    。糟糕的类C方法是在堆上分配字符串并返回它,最好至少作为
    std::unique_ptr
    返回

    在下面的注释后编辑: 由于需要将整数转换为字符串并返回值,因此不能返回临时变量,因此结果必须比方法更有效。基本上有两个坏的选择:

  • 使
    temp
    为静态,这样指针保持有效。缺点是该功能不再是可重入者。这样更安全,因为它不会泄漏
  • 返回堆分配的字符串。最大的危险是,您将让用户取消分配它:
  • 我相信您的代码中也有输入错误:

    return reinterpret_cast<const char *>atoi(name);
    
    返回重新解释卡斯塔托(姓名);
    

    atoi
    不应该在那里,对吗?
    reinterpret\u cast
    应该不需要。

    使用
    std::string
    而不是C样式的字符串。很多问题都会消失。请使用
    std::string
    而不是C样式的字符串。很多问题会消失。我知道这是最好的方法,但是我们还没有得到关于STD图书馆的部分,所以我间接地被迫使用普通的查理,所以另一位老师弯腰教20年的C类C++来证明你的语言有多难。请拿给他们看。我将用错误的解决方案编辑我的答案。@RaduDeleanu
    char name[20]
    将为名称分配20个字节<代码>字符*名称
    不会分配任何内容,您必须创建一个动态数组,就像在案例
    1中所做的那样。
    。因此,更喜欢
    charname[MAX_LEN]。请随意提出更多问题:)第二种选择奏效了!谢谢!没问题:)。但是应该有
    delete[]ptr。否则你会有一个内存泄漏-看看C型解决方案是多么糟糕。我知道这是最好的方式去做这件事,但我们还没有得到关于STD图书馆的部分,所以我间接被迫使用正常查理,所以另一个老师弯腰教20岁的C类C++首先证明你的语言是多么困难…请拿给他们看。我将用错误的解决方案编辑我的答案。@RaduDeleanu
    char name[20]
    将为名称分配20个字节<代码>字符*名称
    不会分配任何内容,您必须创建一个动态数组,就像在案例
    1中所做的那样。
    。因此,更喜欢
    charname[MAX_LEN]。请随意提出更多问题:)第二种选择奏效了!谢谢!没问题:)。但是应该有
    delete[]ptr。否则就会出现内存泄漏-看看类似C的解决方案有多糟糕。
    
    const char* foo(int age){
        char* temp = new char[256];
        _itoa(age, temp, 10);
        return temp;
    }
    
    return reinterpret_cast<const char *>atoi(name);