【问题标题】:Dynamic Memory C++动态内存 C++
【发布时间】:2013-09-30 12:21:42
【问题描述】:

我在删除使用下一个代码分配的内存时遇到了问题:

int main(){
    char **cities;

    cities = new char*[MAX_CITIES];
    for(int i = 0; i < MAX_CITIES; i += 1){
        cities[i] = new char[MAX_CITY_LENGTH];
        cities[i] = "CITY"; //Its only a test value
    }
    cout << "Memory allocated successfully" << endl;

    for(int i = 0; i < MAX_CITIES; i += 1){
        cout << cities[i] << endl;
    }

    for(int i = 0; i < MAX_CITIES; i += 1){
        delete[] cities[i];
    }
    delete[] cities;
    cout << "Memory freed successfully" << endl;
    return EXIT_SUCCESS;
}

我希望你能帮助我。谢谢。

【问题讨论】:

  • 您遇到了什么问题?

标签: c++ pointers memory-management new-operator


【解决方案1】:

问题就在这里:

cities[i] = "CITY"; //Its only a test value

不会CITY 复制到您必须分配的内存中。相反,它会用指向字符串文字“CITY”的指针覆盖指向您刚刚分配的内存的指针。

当您尝试删除它时,会出现问题,因为它不是使用new 分配的内存。由于您覆盖了指向您分配的内存的指针,它就会被泄露。

要使其正常工作,请将 cities[i] = "CITY"; 替换为 strcpy(cities[i], "CITY");,以便将字符复制到分配的内存中。

话虽如此,如果您对此事有任何选择,请使用std::vector&lt;std::string&gt;

【讨论】:

  • 谢谢,现在如果我想在分配和释放内存的函数中分离代码,我会出错。第一个函数的结构为 void loadCities(char **cities),第二个函数的结构为 void deleteCities(char **cities)
  • @user2813556:仔细想想答案的最后一句话。如果您不能使用标准类型,那么创建自己的最小版本然后使用它们会比直接处理所有这些更容易。
猜你喜欢
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-07
  • 2015-06-27
  • 2021-02-28
  • 2015-12-13
相关资源
最近更新 更多