尝试替换字符串中的字符时内存泄漏

时间:2014-03-31 19:45:23

标签: c++ string memory-leaks char

我生成一个大字符,以便将来传递给strcpystrcat的主题。直到我需要用其中一个字符串中的逗号替换所有出现的空格时,一切正常。我搜索了这个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知道线程会打电话给这个功能吗?

2 个答案:

答案 0 :(得分:4)

当您调用std::string::replace时,最佳匹配是一个fumction模板,其第三个和第四个参数是输入迭代器。因此,您传递的字符串文字将被解释为范围的开头和结尾,而不是。这导致了不确定的行为。

您可以使用算法std::replace轻松解决此问题:

std::replace(tmp2.begin(),tmp2.end(),' ',',');

请注意,此处第三个和第四个参数是单个char s。

答案 1 :(得分:3)

来自@juanchopanza的答案正确识别并修复了原始问题,但由于您一般都在询问内存泄漏情况,我还想建议您更换一些不会出现问题的内容。 ; t使用newdeletestrcpystrcat

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,以消除混乱的转换。