代码之家  ›  专栏  ›  技术社区  ›  Elpezmuerto

防止char*矢量中的最后一个元素更改

  •  2
  • Elpezmuerto  · 技术社区  · 15 年前

    我正在读C++中的字符串 fread 我在哪里阅读和存储 shortSiteText 在StTimes中。网站名称声明为 std::vector<char*> siteNames_; 我在其他功能中使用站点名称,但是因为 短文本 是一个指针,当我调用它的delete命令时,它是 siteNames_ 改变了。我该如何预防?

    for (unsigned int i = 0; i <= nSites; i ++){
       fread((char *) &shortSiteTextLength, 1, sizeof shortSiteTextLength, baseFile_);
       shortSiteText = new char[shortSiteTextLength];
       fread(shortSiteText,1, shortSiteTextLength,baseFile_);
       siteNames_.push_back(shortSiteText);
    }
    delete [] shortSiteText;
    

    我尝试使用取消引用运算符: siteNames_.push_back(*shortSiteText); 但这会产生一个编译器错误。

    注意:由于遗留代码,我必须使用fread和char*。

    3 回复  |  直到 15 年前
        1
  •  2
  •   KeatsPeeks    15 年前

    让我们放大这个:

    shortSiteText = new char[shortSiteTextLength];
    siteNames_.push_back(shortSiteText);
    delete [] shortSiteText;
    

    解释 :第二行只推动指向数组的指针,而不是数组本身。然后,第一行取消分配数组,在数组上SiteName的最后一个元素仍然指向该数组;使用该元素时,这将导致未定义的行为。

    乱劈 移除 delete [] shortSiteText

    实际修复 :您遇到此问题是因为您试图自己管理对象所有权。不要!在这里,你可以使用 std::string 仍然能够使用遗留代码, c_str() 成员函数。

    引用我朋友的话:

    一般来说,如果你是 初学者和您的代码包含 “char”这个词,你有个bug。

        2
  •  3
  •   Steve Townsend    15 年前

    你不能 delete[] 任何你推进去的东西 vector 直到 矢量 元素已完成。

    我不清楚这段代码的目的是什么-您只删除了 shortSitetext 不管怎样,这并不是你想的那样(它试图通过匹配来避免内存泄漏) new 具有 delete 我想。

    删除最后一行代码,然后手动清除 矢量 当通过迭代元素调用 删除[ ] 对于每一个 clear() 这个 矢量 .

    或使用 boost::ptr_vector 这将自动为您完成。

    或使用 vector<string> ,将遗产分离 char* 代码从您的现代,非原始指针使用C++世界。你可以推回 const char* 直接到 矢量<字符串> 像这样:

    const char* str;
    // init str to the value you wish
    
    vector<string> vec;
    vec.push_back(str);
    
        3
  •  0
  •   JoshD    15 年前

    在要从矢量中删除数据之前,不要删除shortsitetext。

    您已经创建了一块内存,设置了数据,并将指针保存在向量中。删除的内存与向量元素指向的内存相同。

    刚刚移除了 delete [] shortSiteText; 线。

    但是,请确保在处理完向量后,要小心地删除和删除每个指针。

    推荐文章