我生成一个大字符,以便将来传递给strcpy
和strcat
的主题。直到我需要用其中一个字符串中的逗号替换所有出现的空格时,一切正常。我搜索了这个here
问题是,现在我有内存泄漏,程序退出时显示以下消息:
_Dumping objects ->
{473} normal block at 0x0091E0C0, 32 bytes long.
Data: <AMLUH UL619 BKD > 41 4D 4C 55 48 20 55 4C 36 31 39 20 42 4B 44 20
{472} normal block at 0x049CCD20, 8 bytes long.
Data: < > BC ED 18 00 F0 EC 18 00
{416} normal block at 0x082B5158, 1000 bytes long.
Data: <Number of Aircra> 4E 75 6D 62 65 72 20 6F 66 20 41 69 72 63 72 61
{415} normal block at 0x04A0E200, 20 bytes long.
Data: < > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
{185} normal block at 0x049DA998, 64 bytes long.
Data: < O X8 8 > DC 4F BB 58 38 C5 9A 06 38 D3 88 00 00 00 00 00
PythonPlugin.cpp(76) : {172} normal block at 0x0088D338, 72 bytes long.
Data: < a X F <) > DC 61 BB 58 18 BB 46 06 3C 29 8A 06 CD CD CD CD
Object dump complete._
这里是代码,所以你可以告诉我我做错了什么:
问题代码:
char* loop_planes(ac){
char *char1=new char[1000];
for(...){
strcpy(char1,"Number of Aircrafts\nHour of simulation\n\n");
string tmp2=fp.GetRoute();
tmp2.replace(tmp2.begin(),tmp2.end()," ",","); #PROBLEM IS IN THIS LINE
const char *tmp3=tmp2.c_str();
strcat(char1,tmp3);
}
return char1;
}
fp.GetRoute()
是这样的字符串: AMLUH UL619 BKD UM748 RUTOL
此外,既然我正在谈论内存分配,我不希望任何未来的内存泄漏问题,所以我什么时候应该delete
char1
知道线程会打电话给这个功能吗?
答案 0 :(得分:4)
当您调用std::string::replace
时,最佳匹配是一个fumction模板,其第三个和第四个参数是输入迭代器。因此,您传递的字符串文字将被解释为范围的开头和结尾,而不是。这导致了不确定的行为。
您可以使用算法std::replace
轻松解决此问题:
std::replace(tmp2.begin(),tmp2.end(),' ',',');
请注意,此处第三个和第四个参数是单个char
s。
答案 1 :(得分:3)
来自@juanchopanza的答案正确识别并修复了原始问题,但由于您一般都在询问内存泄漏情况,我还想建议您更换一些不会出现问题的内容。 ; t使用new
或delete
或strcpy
或strcat
。
std::string loop_planes() {
std::string res("Number of Aircrafts\nHour of simulation\n\n");
for (...) {
std::string route = fp.GetRoute();
std::replace(route.begin(), route.end(), ' ',',');
res += route;
}
return res;
}
这不需要任何显式内存分配或删除,也不会泄漏内存。我也冒昧地将返回类型从char *
更改为std::string
,以消除混乱的转换。