这种情况是否需要删除或创建新变量?
Does this situation require a delete or making a new variable?
我正在创建一些代码来“解析”IP 地址。基本上,我正在使用一些遗留代码,这些代码只接受“AAA.BBB.CCC.DDD”形式的 IP 地址,并希望编写类似“10.2.4.3”的内容,并且代码无需输入 010.002.004.003 即可工作. IP 地址保存在一个字符指针中,我编写的函数将零添加到代码 returns 另一个字符指针中。下面的主函数是否可以使用(即没有内存泄漏或其他问题)?
char* parser(char* ip) {
char out[16]; //16 is the length of the final IP address with the dots and [=10=] char at the end
//find output char array
return out;
}
int main() {
char *a="10.2.4.3";
a=parser(a);
return 0;
}
虽然我对 C++ 中的内存泄漏问题的理解是它们是由于使用 new 进行分配但最后没有删除或使用 new 进行分配然后重新分配它们,老实说我不确定在这种情况下。由于 a 是静态分配的,将其分配给在解析器函数中创建的 char 指针是否会导致任何类型的内存泄漏或其他问题?
不,如果您不做任何 new
,则不需要 delete
。但是您的程序遇到了不同的问题:
char* parser(char* ip) {
char out[16]; //16 is the length of the final IP address with the dots and [=10=] char at the end
//find output char array
return out
}
这returns 一个悬挂指针。访问返回值是不安全的,因为它会在函数 returns.
后立即被重用
一种与您所拥有的略有不同的解决方法是:
void parser(const char* ip, char* out) {
// todo: write to out here;
}
int main()
{
const char *a="10.2.4.3";
char out[16];
parser(a, out);
return 0;
}
但这看起来仍然很像用 C++ 编译器编写的旧 C。有更好的结构可用。
我正在创建一些代码来“解析”IP 地址。基本上,我正在使用一些遗留代码,这些代码只接受“AAA.BBB.CCC.DDD”形式的 IP 地址,并希望编写类似“10.2.4.3”的内容,并且代码无需输入 010.002.004.003 即可工作. IP 地址保存在一个字符指针中,我编写的函数将零添加到代码 returns 另一个字符指针中。下面的主函数是否可以使用(即没有内存泄漏或其他问题)?
char* parser(char* ip) {
char out[16]; //16 is the length of the final IP address with the dots and [=10=] char at the end
//find output char array
return out;
}
int main() {
char *a="10.2.4.3";
a=parser(a);
return 0;
}
虽然我对 C++ 中的内存泄漏问题的理解是它们是由于使用 new 进行分配但最后没有删除或使用 new 进行分配然后重新分配它们,老实说我不确定在这种情况下。由于 a 是静态分配的,将其分配给在解析器函数中创建的 char 指针是否会导致任何类型的内存泄漏或其他问题?
不,如果您不做任何 new
,则不需要 delete
。但是您的程序遇到了不同的问题:
char* parser(char* ip) {
char out[16]; //16 is the length of the final IP address with the dots and [=10=] char at the end
//find output char array
return out
}
这returns 一个悬挂指针。访问返回值是不安全的,因为它会在函数 returns.
后立即被重用一种与您所拥有的略有不同的解决方法是:
void parser(const char* ip, char* out) {
// todo: write to out here;
}
int main()
{
const char *a="10.2.4.3";
char out[16];
parser(a, out);
return 0;
}
但这看起来仍然很像用 C++ 编译器编写的旧 C。有更好的结构可用。