Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 需要帮助查找memoryleak吗_C++_Memory Leaks - Fatal编程技术网

C++ 需要帮助查找memoryleak吗

C++ 需要帮助查找memoryleak吗,c++,memory-leaks,C++,Memory Leaks,我已经坐了好几个小时了,快把我逼疯了。IM新太C++,所以如果除了内存泄漏其他东西是错误的,我想知道!D 问题是,如果我制作了一个新的教师/助理/TA并将其打印出来,我会得到: {212} normal block at 0x005694B0, 8 bytes long. Data: < V > BC 91 56 00 00 00 00 00 {210} normal block at 0x005691B8, 40 bytes long. Data: <

我已经坐了好几个小时了,快把我逼疯了。IM新太C++,所以如果除了内存泄漏其他东西是错误的,我想知道!D

问题是,如果我制作了一个新的教师/助理/TA并将其打印出来,我会得到:

{212} normal block at 0x005694B0, 8 bytes long.
 Data: <  V     > BC 91 56 00 00 00 00 00 
{210} normal block at 0x005691B8, 40 bytes long.
 Data: <      V Oliver  > BC A4 16 00 B0 94 56 00 4F 6C 69 76 65 72 00 CD 
{209} normal block at 0x00568F30, 8 bytes long.
 Data: <  V     > 90 8E 56 00 00 00 00 00 
{208} normal block at 0x00569468, 8 bytes long.
 Data: <d V     > 64 8E 56 00 00 00 00 00 
{204} normal block at 0x00568E60, 76 bytes long.
 Data: <    h V elev    > D4 A6 16 00 68 94 56 00 65 6C 65 76 00 CD CD CD 
{212}0x005694B0处的正常块,8字节长。
数据:BC 91 56 00
0x005691B8处的{210}正常块,40字节长。
资料:BC A4 16 00 B0 94 56 00 4F 6C 69 76 65 72 00 CD
0x00568F30处的{209}正常块,8字节长。
数据:90 8E 56 00
0x00569468处的{208}正常块,8字节长。
数据:64 8E 56 00
0x00568E60处的{204}正常块,76字节长。
数据:D4 A6 16 00 68 94 56 00 65 6C 65 76 00 CD
如果我一直重复它,它就会堆积起来,我将感谢所有能得到的帮助!:D

    int main(){



    int choise, count=0;
    bool ta = false , teacher = false, assistant = false;
    choise = meny();

    Employee **work = NULL;
    Employee **swapper = NULL;
    Employment *tmp = NULL;

    string name, types, subject, temp, type;
    int birthyear, salary, workhours, points;
    bool boss = false, ansvarig, key=false, cert;

    while (choise != NULL){
        if (choise > 0){

            if (choise == 1){
                fflush(stdin);
                cout << endl << "Namn: ";
                getline(cin, name);
                cout << endl << "Fodelsear: ";
                cin >> birthyear;
                cin.ignore();
                cout << "\nTjänst: ";
                getline(cin, type);
                cout << "\nLon: ";
                cin >> salary;
                cin.ignore();
                cout << "\nChef: ";
                cin >> temp;
                cin.ignore();
                if (temp == "Ja" || temp == "ja"){
                    boss = true;
                }
                else
                    boss = false;
                cout << "\nTjanstgoringstid: ";
                cin >> workhours;
                cin.ignore();
                cout << "\nHuvudämne: ";
                cin >> subject;
                cin.ignore();
                cout << "\nProgramansvarig: ";
                cin >> temp;
                cout << "\n\n\n";
                cin.ignore();
                if (temp == "Ja" || temp == "ja")
                    ansvarig = true;
                else
                    ansvarig = false;



                count++;
                teacher = true;

            }
            else if (choise == 2){
                fflush(stdin);
                cout << endl << "Namn: ";
                getline(cin, name);

                cout << endl << "Fodelsear: ";
                cin >> birthyear;
                fflush(stdin);

                cout << "\nTjänst: ";
                getline(cin, type);

                cout << "\nLon: ";
                cin >> salary;
                fflush(stdin);

                cout << "\nHuvudämne: ";
                cin >> subject;
                fflush(stdin);

                cout << "Avklarade poang: ";
                cin >> points;
                fflush(stdin);
                count++;

                assistant = true;
            }
            else if (choise == 3){

                fflush(stdin);

                cout << endl << "Namn: ";
                getline(cin, name);

                cout << endl << "Fodelsear: ";
                cin >> birthyear;
                cin.ignore();

                cout << "\nTjänst: ";
                getline(cin, type);


                cout << "\nLon: ";
                cin >> salary;
                cin.ignore();

                cout << "\nTjanstgoringstid: ";
                cin >> workhours;
                cin.ignore();

                cout << "\nAttestratt: ";
                cin >> temp;
                cin.ignore();
                if (temp == "Ja" || temp == "ja"){
                    cert = true;
                }
                else
                    cert = false;

                cout << "\nHar huvudnyckel: ";
                cin >> temp;
                cin.ignore();
                if (temp == "Ja" || temp == "ja"){
                    cert = true;
                }
                else
                    cert = false;


                cout << "\n\n\n";




                count++;
                ta = true;
            }

            else if (choise == 4){
                for (int x = 0; x < (count); x++){
                    cout << work[x]->toString();
                }
            }
            if (choise != 0 && choise!=4){
                swapper = new Employee*[count];

                if (teacher == true){
                    tmp = new Teacher(type, boss, salary, workhours, subject, ansvarig);

                    swapper[count - 1] = new Employee(name, birthyear, tmp);

                    teacher = false;

                    //delete tmp;
                }
                else if (ta == true){
                    tmp = new TA(type, boss, salary, workhours, cert, key);

                    swapper[count - 1] = new Employee(name, birthyear, tmp);

                    assistant = false;

                //  delete tmp;
                }
                else if (assistant == true){
                    tmp = new Assistant(type, salary, subject, points);


                    swapper[count - 1] = new Employee(name, birthyear, tmp);

                //  delete tmp;


                }



                    for (int x = 0; x < count - 1; x++){
                    swapper[x] = work[x];
                    }



                delete[] work;



                work = swapper;



            }

                choise = meny();




        }
    }

    /*for (int x = 0; x < count; x++){
        delete work[x];
        }*/

    delete [] work;



    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
    _CrtDumpMemoryLeaks();

    return 0;

}
intmain(){
整数选择,计数=0;
bool ta=false,教师=false,助手=false;
choise=meny();
员工**工作=空;
员工**交换者=NULL;
就业*tmp=NULL;
字符串名称、类型、主题、临时、类型;
int生日、工资、工作时间、积分;
bool boss=false,ansvarig,key=false,cert;
while(choise!=NULL){
如果(选择>0){
如果(选项==1){
fflush(stdin);
加班时间;
cin.ignore();
主题;
cin.ignore();
温度;
库特温度;
cin.ignore();
如果(温度==“Ja”|温度==“Ja”){
cert=真;
}
其他的
证书=假;

cout你永远不会
删除你的数组。无论如何你都应该使用向量。

基本上,对于你做的每一个
新的
,当对象不再需要时,你需要有一个
删除

执行此操作将释放内存。如果不这样做,则会一直累积大量已分配的内存。

每当动态分配内存而不释放内存时,就会发生内存泄漏。这意味着,对于程序中出现的每一个
新的
,必须存在相应的
删除
,否则就会发生泄漏记忆

在您的代码中有许多已注释掉的
delete
s(例如,对于
tmp
)。因此,我们一下子就知道这些分配正在泄漏

同样,为
swapper
分配的内存也没有被释放(至少是第一次通过循环)。此外,即使调用
delete[]work
,也不会
delete
删除数组中的单个元素,这些元素也是动态分配的


由于所有这些分配都发生在一个循环中,难怪您会有这么多泄漏!

我并不奇怪您会遇到困难。您手动执行内存管理,您的代码几乎无法读取,并且没有任何注释!请提交一个新问题以寻求帮助“重构”您的代码,其中包括除现有代码外的分配说明。这样您将获得更好的帮助。@Prolle:
swapper=new Employee*[count];
如果我尝试删除delete[]工作旁边的swaper,则调试断言失败。_BLOCK_TYPE_有效/(pHead->nBlockUse)我应该在哪里删除我的交换程序?:d祝你好运,但我强烈建议你改变分配内存的方式。一个简单的方法是实现构造函数和析构函数,这将更加清晰。在main中使用new和delete从来都不是更好的方法。或者一个非常好的方法就是简单地使用vectors。for示例vector,vector等。HMm将尝试vector out!:D