C++ C++;动态内存泄漏

C++ C++;动态内存泄漏,c++,pointers,memory,memory-leaks,C++,Pointers,Memory,Memory Leaks,所以我有一个问题,我目前正在学习如何获得动态内存来分配堆中的变量(在C++上),所以我只需创建一个结构并在其上放置一些项,然后在deleteList(Esstructura*)函数中删除所有变量,问题是我分配了大量内存,因此会泄漏 struct estructura { char *algo; double *algo2; estructura *next; }; estructura* lastEstructura(estructura *head) {

所以我有一个问题,我目前正在学习如何获得动态内存来分配堆中的变量(在C++上),所以我只需创建一个结构并在其上放置一些项,然后在deleteList(Esstructura*)函数中删除所有变量,问题是我分配了大量内存,因此会泄漏

    struct estructura
{
    char *algo;
    double *algo2;
    estructura *next;
};

estructura* lastEstructura(estructura *head)
{
    estructura *current = head;
    while (current -> next)
    {
        current = current -> next;
    }
    return current;
}

void crearLista(estructura *head)
{
    for (int i = 0; i < 8200; i++)
    {
        estructura *current = new estructura;
        current -> algo = new char[100];
        current -> algo2 = new double;
        current -> next = nullptr;
        estructura *temp = lastEstructura(head);
        temp -> next = current;
    }
}

void deleteList(estructura *head)
{
    estructura *current = head;
    while (current) {
        estructura *temp = current;
        current = current -> next;
        delete [] temp -> algo;
        delete temp -> algo2;
        temp -> next = nullptr;
        delete temp;
    }
}

int main(int argc, const char * argv[])
{
    int i = 0;
    cout << "enter: ";
    cin >> i;
    do {
        estructura *head = new estructura;
        head -> algo = new char[100];
        head -> algo2 = new double;
        head -> next = nullptr;
        crearLista(head);
        deleteList(head);
        cout << "enter: ";
        cin >> i;
    } while (i == 1);
    return 0;
}
struct结构
{
字符*算法;
双*algo2;
下一步;
};
Estrestructure*LastEstrestructure(Estrestructure*head)
{
E结构*电流=水头;
while(当前->下一步)
{
当前=当前->下一步;
}
回流;
}
void crearLista(Estrestructura*头部)
{
对于(int i=0;i<8200;i++)
{
estructura*当前=新的estructura;
当前->算法=新字符[100];
当前->算法2=新的双精度;
当前->下一步=空PTR;
Estrestructura*temp=最近的Estrestructura(压头);
温度->下一步=当前;
}
}
作废删除列表(Estrestructura*head)
{
E结构*电流=水头;
while(当前){
E结构*温度=电流;
当前=当前->下一步;
删除[]临时->算法;
删除temp->algo2;
temp->next=nullptr;
删除临时文件;
}
}
int main(int argc,const char*argv[]
{
int i=0;
cout>i;
做{
Esstructura*head=新的Esstructura;
head->algo=新字符[100];
head->algo2=新双精度;
head->next=nullptr;
克雷利斯塔(头部);
删除列表(标题);
cout>i;
}而(i==1);
返回0;
}
我真的很想了解这一点,为什么我会得到这个漏洞,所以请有人帮助我,我已经尝试过搜索,但没有找到可以帮助我的东西。
(我对C++比较陌生)

问题的一部分是您正在分配已分配对象的成员。如果您只有以下内容,您的代码将更简单:

struct estructura
{
    char algo[100];
    double algo2;
    estructura *next;
};

这样,
new-estrastructa
会提供您所需的完整结构,然后
delete-current
是您唯一需要做的事情。此外,如果您将新成员添加到
Estrestructure
,则一切都可以正常工作,而无需担心添加另一个
new
/
delete

您删除了结构字段,但忘记了删除结构实例。而且,创建列表的效率非常低。您可以在O(n^2)中完成,而在O(n)中可以完成。

您可以通过将程序更改为使用
std::string
而不是
char*algo
或类似的方式来节省大量的麻烦。还有,为什么要用循环分配8200个列表元素呢?一旦你学会了标准库(std::string,std::vector…),你就不需要再费劲了。当然,到那时,您将不会实现自己的链表,而是使用标准库来实现它。此外,如果您确实需要使用新的std::unique_ptr和std::shared_ptr,也可以解决此问题。请使用调试器/valgrind,但不要在第一位询问。多少是“巨大的内存”?我在这里没有看到任何看起来会导致内存泄漏的东西。在我读到的所有东西中,为什么你认为你有内存泄漏?使用内存的程序正常。当它终止时,没有释放所有新的东西,当出现泄漏时。是否有工具告诉过您这是个问题,或者您只是怀疑它?使用std::string更好?您的意思是,除了不推荐之外,分配已分配对象的成员将表示泄漏?这是我不太清楚的部分。是的,我知道,这只是一个简单的想法总结,这里的想法不是优化,而是我对内存泄漏的怀疑。不过谢谢你。