该函数收集数组并 returns 它。 ciout之后内存还是被这个数组占用了吧?
The function collects the array and returns it. After ciout memory is still occupied by this array, right?
我有以下功能:
void setFore(const short arg) {
char ansicode[12] = "\e[38;5;";
char code[4];
snprintf(code, 4, "%d", arg);
strcat(ansicode, code);
strcat(ansicode, "m");
std::cout << ansicode; }
使用起来像
std::cout << "Some text";
setFore(50);
std::cout << "Some text\n";
执行后自动删除array ansicode。
我想做这样的功能:
char* setFore(const short arg) {
char ansicode[12] = "\e[38;5;";
char code[4];
snprintf(code, 4, "%d", arg);
strcat(ansicode, code);
strcat(ansicode, "m");
return &ansicode; }
并将其用作std::cout << "Some text" << setFore(50) << "Some text\n";
。
但是还有一个问题,ansicode数组占用的内存还会继续占用内存吗?由于数组不是用new创建的,所以即使分配了指针也无法释放它。我该怎么办?
But one question remains, will the memory occupied by the ansicode array continue to occupy the memory?
C 风格的数组有自动生命周期,它们会在局部范围结束后被销毁,所以在函数返回后尝试对它们做任何事情是未定义的行为,你应该考虑使用像 std::string
:
std::string setFore(const short arg) {
return "3[38;5;" + std::to_string(arg) + "m";
}
返回本地数组将不起作用,因为它会在函数作用域结束时被销毁。我建议改用 std::string
和 std::ostringstream
:
#include <sstream>
#include <string>
std::string setFore(short arg) {
std::ostringstream os;
os << "\x1b[38;5;" << arg << 'm';
return os.str();
}
如果您 以后出于某种原因需要 char*
,您可以使用返回字符串的 data()
或 c_str()
成员函数。
正如 Thomas Matthews 在评论中指出的那样,\e
不是标准转义序列,因此我将其替换为十六进制值 1b
(27
dec)。
我有以下功能:
void setFore(const short arg) {
char ansicode[12] = "\e[38;5;";
char code[4];
snprintf(code, 4, "%d", arg);
strcat(ansicode, code);
strcat(ansicode, "m");
std::cout << ansicode; }
使用起来像
std::cout << "Some text";
setFore(50);
std::cout << "Some text\n";
执行后自动删除array ansicode。 我想做这样的功能:
char* setFore(const short arg) {
char ansicode[12] = "\e[38;5;";
char code[4];
snprintf(code, 4, "%d", arg);
strcat(ansicode, code);
strcat(ansicode, "m");
return &ansicode; }
并将其用作std::cout << "Some text" << setFore(50) << "Some text\n";
。
但是还有一个问题,ansicode数组占用的内存还会继续占用内存吗?由于数组不是用new创建的,所以即使分配了指针也无法释放它。我该怎么办?
But one question remains, will the memory occupied by the ansicode array continue to occupy the memory?
C 风格的数组有自动生命周期,它们会在局部范围结束后被销毁,所以在函数返回后尝试对它们做任何事情是未定义的行为,你应该考虑使用像 std::string
:
std::string setFore(const short arg) {
return "3[38;5;" + std::to_string(arg) + "m";
}
返回本地数组将不起作用,因为它会在函数作用域结束时被销毁。我建议改用 std::string
和 std::ostringstream
:
#include <sstream>
#include <string>
std::string setFore(short arg) {
std::ostringstream os;
os << "\x1b[38;5;" << arg << 'm';
return os.str();
}
如果您 以后出于某种原因需要 char*
,您可以使用返回字符串的 data()
或 c_str()
成员函数。
正如 Thomas Matthews 在评论中指出的那样,\e
不是标准转义序列,因此我将其替换为十六进制值 1b
(27
dec)。