简体   繁体   中英

Triggering a breakpoint while deleting memory C++

In my task I need to input some data about, let's say, depositor and then increase his amount of money by 15% but that`s not the point. The main problem is that it always "triggers a breakpoint" and transfers me to this page在此处输入图像描述

Function where I allocate memory:

void allocateMemory(char*** szData, const int rows, const int words, const int max) { 
    for (int i = 0; i < rows; i++)
    {
        szData[i] = new char* [words]; //how many words in every row
        for (int j = 0; j < words; j++)
        {
            szData[i][j] = new char[max]; //maximum quantity of symbols in every word
        }
    }
}

Function where I assign some values:

void assignFirst(char*** szData, const int rows, const int max) { 

    char* s1 = new char[max];  
    char* s2 = new char[max];
    char* s3 = new char[max];
    char* s4 = new char[max];
    char* s5 = new char[max];

    cin >> s1 >> s2 >> s3 >> s4 >> s5;

    for (int i = 0; i < rows; i++)
    {
        szData[i][0] = s1;
        szData[i][1] = s2;
        szData[i][2] = s3;
        szData[i][3] = s4;
        szData[i][4] = s5;
    }
}

Function where I delete memory:

void freeMemory(char*** szData, const int rows, const int words) { 
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < words; j++)
        {
            delete[] szData[i][j];
        }
    }

    for (int i = 0; i < rows; i++)
    {
        delete[] szData[i];
    }

    delete[] szData;
}

How it looks in the console and where it breaks在此处输入图像描述 How can I solve it? PS cannot do it using string (must be an array of characters) or vector as it is the condition of my task I was given. And yes, I know that new is sort of outdated

Full code:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <iomanip>
#include <conio.h> 

using namespace std;

void allocateMemory(char*** szData, const int rows, const int words, const int max);
void assignFirst(char*** szData, const int rows, const int max);
void print(char*** szData, const int rows, const int words);
void freeMemory(char*** szData, const int rows, const int words);

void main() {
    const int rowCount = 2;
    const int wordCount = 5; //number of words in every row
    const int maxWordLength = 10; 

    char*** szData = new char** [rowCount];

    allocateMemory(szData, rowCount, wordCount, maxWordLength);

    assignFirst(szData, rowCount, maxWordLength);
    print(szData, rowCount, wordCount);

    freeMemory(szData, rowCount, wordCount);
}

void allocateMemory(char*** szData, const int rows, const int words, const int max) { 
    for (int i = 0; i < rows; i++)
    {
        szData[i] = new char* [words]; //how many words in every row
        for (int j = 0; j < words; j++)
        {
            szData[i][j] = new char[max]; //maximum quantity of symbols in every word
        }
    }
}

void assignFirst(char*** szData, const int rows, const int max) { 

    char* s1 = new char[max];  
    char* s2 = new char[max];
    char* s3 = new char[max];
    char* s4 = new char[max];
    char* s5 = new char[max];

    cin >> s1 >> s2 >> s3 >> s4 >> s5;

    for (int i = 0; i < rows; i++)
    {
        szData[i][0] = s1;
        szData[i][1] = s2;
        szData[i][2] = s3;
        szData[i][3] = s4;
        szData[i][4] = s5;
    }
}

void print(char*** szData, const int rows, const int words) { 
    for (int i = 0; i < rows - 1; i++) 
    {
        for (int j = 0; j < words; j++)
        {
            if (j == 3) //change fourth element
            {
                double a = atoi(szData[i][3]); //convert fourth element into double
                a = a * 1.15; //add 15% to it
                cout << a << " ";
            }
            else
                cout << szData[i][j] << " ";
        }
        cout << endl;
    }
}

void freeMemory(char*** szData, const int rows, const int words) { 
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < words; j++)
        {
            delete[] szData[i][j];
        }
    }

    for (int i = 0; i < rows; i++)
    {
        delete[] szData[i];
    }

    delete[] szData;
}

The bug is here

void assignFirst(char*** szData, const int rows, const int max) { 

    char* s1 = new char[max];  
    ...
    for (int i = 0; i < rows; i++)
    {
        szData[i][0] = s1;
        ...
    }
}

You assign the same pointer to multiple entries of szData . But here

for (int i = 0; i < rows; i++)
{
    for (int j = 0; j < words; j++)
    {
        delete[] szData[i][j];
    }
}

you delete those pointers as if they are all separately allocated.

In other words you are deleteing the same pointer multiple times, and that explains the error.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM