我有一个问题找不到答案。
如果我有这样的功能:
char* f1(char ch, int len) {
char* s1=new char[len+1);
for(int i; i<len; i++) s1[i]=ch;
s1[len]=0;
}
我这样称呼它:
char* str;
str=f1("A", 10);
std:cout << "Something " << str << std::endl;
delete[] str;
一切都好,但如果我想像这样使用它更短:
std:cout << "Something " << f1("A", 10) << std::endl;
我最终会分配到无法释放的内存。 请记住,内存泄漏不好,应该避免 - 有没有办法以正确的方式做到这一点?
尝试在互联网上搜索但没有结果。
考虑创建从函数分配的指针列表,并稍后在某个地方释放它们,但这不是最好/安全的方法,因为它很容易混乱。
您可以像这样使用
std::unique_ptr
:
#include <memory>
#include <iostream>
typedef std::unique_ptr<char[]> MyPtr;
MyPtr f1(char ch, int len) {
MyPtr s1(new char[len+1]);
for(int i=0; i<len; i++) s1[i]=ch;
s1[len]=0;
return s1;
}
int main()
{
std::cout << "Something " << f1('A', 10).get() << std::endl;
}
背景:从
f1
返回的对象在语句结束时被销毁——也就是说,在执行该行之后,当到达 ;
时。
当然,归根结底,您应该只使用
std::string
——毕竟,您使用的是 C++...
#include <iostream>
#include <string>
int main()
{
std::cout << "Something " << std::string(10, 'A') << std::endl;
}
您的代码中有几个问题:
f1
应该返回 char*
但不包含 return
语句(如 return s1;
)。
您用
f1
呼叫 f1("A", 10)
。但第一个参数应该是 char
而“A”不是。应该是f1('A', 10)
。
在 C++ 中,不建议使用原始 C 数组。它的问题之一是您遇到的需要手动内存管理。最好使用标准库类,如
std::vector
(用于通用动态数组),或者在这种以空结尾的字符数组的情况下 - 使用 std::string
。
std::string
已经有一个构造函数,它接受长度和字符并创建一个字符串,就像你的f1
尝试做的那样,所以你可以简单地使用:
std::cout << "Something " << std::string(10, 'A') << std::endl;
输出:
Something AAAAAAAAAA