gpt4 book ai didi

c++ - 另一个C++学习时刻 : returning strings from functions

转载 作者:IT老高 更新时间:2023-10-28 22:31:58 26 4
gpt4 key购买 nike

我有一些关于 C++ 的基本问题。考虑以下我尝试返回字符串的代码。

const std::string&
NumberHolder::getValueString() {
char valueCharArray[100];
sprintf_s(valueCharArray,"%f",_value);
std::string valueString(valueCharArray);
return valueString;
}

我正在尝试返回一个字符串,其中包含名为 _value 的类成员的值。但是,我收到警告说我正在尝试将指针传回局部变量。这当然是一件坏事。如果此时我对 C++ 有足够的了解,这意味着当有人尝试使用它时,我传回的指针已经调用了 delete。所以我修改:

const std::string&
NumberHolder::getValueString() {
char valueCharArray[100];
sprintf_s(valueCharArray,"%f",_value);
std::string valueString = new std::string(valueCharArray);
return (*valueString);
}

这应该在堆栈上创建一个指针,该指针将在此函数之外存在。但是这里有两个问题:1)它无论如何都无法编译,我不明白为什么(错误= 无法从'std::string *'转换为'std::basic_string<_Elem,_Traits,_Ax>' ) 和 2) 这似乎是潜在的内存泄漏,因为我依靠其他人来调用删除这个人。我应该在这里使用什么模式?

最佳答案

通过在堆上分配 std::string 来解决问题!

只需像这样按值返回它:

std::string NumberHolder::getValueString()
{
char valueCharArray[100];
sprintf_s(valueCharArray,"%f",_value);
return std::string(valueCharArray);
}

现在几乎每个编译器都会做return value optimization (RVO)在返回声明上,因此不应制作拷贝。考虑以下几点:

NumberHolder holder;
// ...
std::string returnedString = holder.getValueString();

使用 RVO,编译器将为 NumberHolder::getValueString() 的上述实现生成代码,以便在 std::string 的位置构造 returnedString,所以不需要拷贝。

关于c++ - 另一个C++学习时刻 : returning strings from functions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3282608/

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