C++ 如何防止这些内存泄漏?

C++ 如何防止这些内存泄漏?,c++,memory-leaks,C++,Memory Leaks,我遇到了巨大的内存泄漏问题,我不知道该把删除放在哪里来消除它们。下面是我代码的一部分,还有一个完整的: 内存泄漏是源代码中最小的问题。事实上,在您的示例中根本不需要堆分配 以下是一些快速改进: -使用std::string而不仅仅是string,我想您使用的是名称空间std -不要返回指向字符串的指针,只需声明一个字符串并返回它即可 -如果不返回int,请不要将其引用用作函数参数 -尽可能多地使用const -将string*替换为const string&如果不返回它 -不要在堆上用new分配

我遇到了巨大的内存泄漏问题,我不知道该把删除放在哪里来消除它们。下面是我代码的一部分,还有一个完整的:


内存泄漏是源代码中最小的问题。事实上,在您的示例中根本不需要堆分配

以下是一些快速改进: -使用std::string而不仅仅是string,我想您使用的是名称空间std -不要返回指向字符串的指针,只需声明一个字符串并返回它即可 -如果不返回int,请不要将其引用用作函数参数 -尽可能多地使用const -将string*替换为const string&如果不返回它 -不要在堆上用new分配字符串,而是在堆栈上声明它 -使用向量


可以使用这个和Scott Meyers的书来做其他C++的好实践。

< p>内存泄漏是那个源代码中的最小问题。事实上,在您的示例中根本不需要堆分配

以下是一些快速改进: -使用std::string而不仅仅是string,我想您使用的是名称空间std -不要返回指向字符串的指针,只需声明一个字符串并返回它即可 -如果不返回int,请不要将其引用用作函数参数 -尽可能多地使用const -将string*替换为const string&如果不返回它 -不要在堆上用new分配字符串,而是在堆栈上声明它 -使用向量


可以使用其他的Scott Meyers和C++的其他优秀实践。

防止内存泄漏,避免手动内存管理。您可以使用很多工具

例如,以字符串数组为例:

string* startowa(int& rozmiar) {
    rozmiar = 5;
    string* tablica = new string[rozmiar];

    // ...
}
这应该被std::vector替换。由于向量跟踪其大小,因此不需要将大小作为参考传递:

 std::vector<std::string> startowa() {
    // ...
    std::vector<std::string> tablica(5);

    // ...
}
你的minusx函数变成:

void minusx(std::vector<std::string>& tab) {
    tab.pop_back();
}
由于std::vector本身管理它的内存,所以不需要在任何地方删除它


如果您不想使用vector,可以始终使用std::unique\u ptr。代码中唯一的区别是将tablica.get发送到函数中,并使用std::make_uniquerozmiar而不是新的std::string[rozmiar]

为防止类似的内存泄漏,请避免手动内存管理。您可以使用很多工具

例如,以字符串数组为例:

string* startowa(int& rozmiar) {
    rozmiar = 5;
    string* tablica = new string[rozmiar];

    // ...
}
这应该被std::vector替换。由于向量跟踪其大小,因此不需要将大小作为参考传递:

 std::vector<std::string> startowa() {
    // ...
    std::vector<std::string> tablica(5);

    // ...
}
你的minusx函数变成:

void minusx(std::vector<std::string>& tab) {
    tab.pop_back();
}
由于std::vector本身管理它的内存,所以不需要在任何地方删除它

如果您不想使用vector,可以始终使用std::unique\u ptr。代码中唯一的区别是将tablica.get发送到函数中,并使用std::make_uniquerozmiar而不是新的std::string[rozmiar]

正确答案。例如:

vector<string> startowa(int& rozmiar)
{
    rozmiar = 5;
    vector<string> tablica(rozmiar);

    for (int i = 0; i < rozmiar; i++)
        tablica[i] = "text";
    return tablica;
}
startowa分配了一个字符串数组,并将指向该数组的指针存储在tablica中

plusx分配了一个新的字符串数组,一个指针已经返回并写入startowa返回的指针。startowa的阵列现在实际上已经丢失、泄漏,因为几乎不可能再次找到以删除[]

我们需要删除[]tablica;在做作业之前。显然,在调用plusx之前我们不能这样做,因为tablica是一个参数,所以我们需要存储一个temp

            string * temp = plusx(tablica, rozmiar);
            delete[] tablica;
            tablica = temp;
但是,如果发生了意想不到的事情,又发生了什么呢?代码从未命中delete[],并且两个分配都将丢失。vector为您处理所有这些

回到代码上来

        }
        if (wybor == 6)
            wybor = 55;
        else
        {
            rozmiar--;
            tablica = minusx(tablica, rozmiar);
与上述问题和解决方案相同

        }
        // there were other "ifs" but its just a part of the code
    }
    for (int i = 0; i < rozmiar; i++)
        cout << tablica[i] << endl;

    delete[] tablica;
正确答案。例如:

vector<string> startowa(int& rozmiar)
{
    rozmiar = 5;
    vector<string> tablica(rozmiar);

    for (int i = 0; i < rozmiar; i++)
        tablica[i] = "text";
    return tablica;
}
startowa分配了一个字符串数组,并将指向该数组的指针存储在tablica中

plusx分配了一个新的字符串数组,一个指针已经返回并写入startowa返回的指针。startowa的阵列现在实际上已经丢失、泄漏,因为几乎不可能再次找到以删除[]

我们需要删除[]tablica;在做作业之前。显然,在调用plusx之前我们不能这样做,因为tablica是一个参数,所以我们需要存储一个temp

            string * temp = plusx(tablica, rozmiar);
            delete[] tablica;
            tablica = temp;
但是,如果发生了意想不到的事情,又发生了什么呢?代码从未命中delete[],并且两个分配都将丢失。vector为您处理所有这些

回到代码上来

        }
        if (wybor == 6)
            wybor = 55;
        else
        {
            rozmiar--;
            tablica = minusx(tablica, rozmiar);
与上述问题和解决方案相同

        }
        // there were other "ifs" but its just a part of the code
    }
    for (int i = 0; i < rozmiar; i++)
        cout << tablica[i] << endl;

    delete[] tablica;

愚蠢但准确的答案是:不使用原始动态内存。在那里不需要任何东西,需要快速浏览。不要在C++中使用新的。用STD::vector替换动态数组。如果仍然需要指针,请使用std::unique\u ptr替换原始指针。现在C++中很少需要新的/Delphi了,在使用之前,你应该先考虑一下。如果你有一个裸体的新的,你可能需要删除。愚蠢,但准确,回答:不使用原始动态内存。没有看到任何需要我的东西
快速浏览。不要在C++中使用新的。用STD::vector替换动态数组。如果仍然需要指针,请使用std::unique\u ptr替换原始指针。现在C++中很少需要新的/Delphi了,在使用之前,你应该先考虑一下。如果你有一个新的裸体,你可能需要删除。