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++类。
然后在此处按值返回bystd::string
。糟糕的类C方法是在堆上分配字符串并返回它,最好至少作为std::unique_ptr
返回
在下面的注释后编辑:
由于需要将整数转换为字符串并返回值,因此不能返回临时变量,因此结果必须比方法更有效。基本上有两个坏的选择:
使temp
为静态,这样指针保持有效。缺点是该功能不再是可重入者。这样更安全,因为它不会泄漏
返回堆分配的字符串。最大的危险是,您将让用户取消分配它:
我相信您的代码中也有输入错误:
return reinterpret_cast<const char *>atoi(name);
返回重新解释卡斯塔托(姓名);
atoi
不应该在那里,对吗?reinterpret\u cast
不应该被需要。您将一个地址带到一个临时地址(位于堆栈上),该地址将使返回的指针几乎立即悬空
<>我强烈建议使用<代码> STD::string < /COD>字符串,不要用C++编写C++类。
然后在此处按值返回bystd::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++来证明你的语言有多难。请拿给他们看。我将用错误的解决方案编辑我的答案。@RaduDeleanuchar name[20]
将为名称分配20个字节<代码>字符*名称
不会分配任何内容,您必须创建一个动态数组,就像在案例1中所做的那样。
。因此,更喜欢charname[MAX_LEN]代码>。请随意提出更多问题:)第二种选择奏效了!谢谢!没问题:)。但是应该有delete[]ptr在代码后面某个位置返回指针上的code>。否则你会有一个内存泄漏-看看C型解决方案是多么糟糕。我知道这是最好的方式去做这件事,但我们还没有得到关于STD图书馆的部分,所以我间接被迫使用正常查理,所以另一个老师弯腰教20岁的C类C++首先证明你的语言是多么困难…请拿给他们看。我将用错误的解决方案编辑我的答案。@RaduDeleanuchar name[20]
将为名称分配20个字节<代码>字符*名称
不会分配任何内容,您必须创建一个动态数组,就像在案例1中所做的那样。
。因此,更喜欢charname[MAX_LEN]代码>。请随意提出更多问题:)第二种选择奏效了!谢谢!没问题:)。但是应该有delete[]ptr在代码后面某个位置返回指针上的code>。否则就会出现内存泄漏-看看类似C的解决方案有多糟糕。
const char* foo(int age){
char* temp = new char[256];
_itoa(age, temp, 10);
return temp;
}
return reinterpret_cast<const char *>atoi(name);