Получение повреждения кучи при записи в файл

Я пытаюсь записать powerset в файл, но я получаю кучу повреждений, если мой начальный массив больше, чем размер 6, и я не уверен, почему. Он отлично работает с любым размером массива 6 или ниже. Не могу понять это.

Кроме того, test.txt - это то, где я читаю в массиве. Если файл содержит "1,2,3,4,5,6", он работает нормально, но содержит "1,2,3,4,5,6,7". Я получаю кучу повреждений.

#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <iostream>
#include <fstream>
#include <sstream>
#include <algorithm>
#include "N26.h"
#include <math.h>

using namespace std;

void increaseArray(int* theArray, int size)  
{  
    int i = size;  
    int n = i+1;  
    int* newArray = new int[n];  

    for(int cnt=0;cnt<n;cnt++)
    {  
        newArray[cnt] = theArray[cnt];  
    }  

    newArray[n-1]= NULL;
    theArray = newArray;

    return;  
} 

void printPowerSet(int *s, int n)
{
    int i=0,j=0;
    ofstream myFile;
    double SetSize=pow(2.0,n);

    myFile.open("powerset1.txt", std::ios_base::app);

    cout<<"{size of  original}"<< n <<endl;
    cout<<"{number of sets}"<< SetSize-1 <<endl;

    for(i=1;i<SetSize;++i)
    {
        for(j=0;j<n;++j)
        {
            if(((i>>j)&1)==1)
            {           
                myFile << s[j] <<",";
            }
        }

        myFile<<endl;
    }

    return;
}

int main()
{
   ifstream myFile;
   int item;
   string input ="";

   string fileName = "test.txt";

    myFile.open(fileName);
    while(myFile)
    {   
        int k = 1;
        int* transaction= new int[1];

        if(!getline(myFile,input))
            break;

        istringstream ss(input);
        while(ss)
        {
            if(!getline(ss,input, ','))
                break;

            input.erase(remove_if(input.begin(), input.end(), isspace), input.end());
            item = atoi(input.c_str());
            transaction[k-1] = item;
            increaseArray(transaction,k);

            k++;
        }

        for(int i =0; i<k-1;i++)
        {
            cout << transaction[i];
        }
        printPowerSet(transaction, k-1);
            cout << endl;
        transaction=NULL;
}

    system("Pause");
   return 0;
}

2 ответа

Ваш increaseArray() Функция не работает, потому что вы изменяете только локальную копию указателя. Вам нужно будет передать двойной указатель или ссылку на указатель, чтобы сделать то, что вы хотите.

Пример ссылки на указатель: void увеличить Array(int*& theArray, int size)

Вместо этого я бы рекомендовал использовать std::vector, так как это будет расти автоматически.

Я сомневаюсь, что это имеет какое-то отношение к вашей проблеме, но я не вижу, чтобы вы когда-либо удаляли. У тебя утечка памяти. Перед переназначением вашего указателя с новым выделением удалите старое выделение:

delete [] theArray; // The "[]" is important!
theArray = newArray;

В дополнение к ответу Фреда.

Посмотрите, что происходит внутри increaseArray()конкретно эти строки:

int i = size;  
int n = i+1;  
int* newArray = new int[n];  

for(int cnt=0;cnt<n;cnt++)
{  
    newArray[cnt] = theArray[cnt];  
}  

Вы выделяете массив size + 1 элементы, а затем перебрать оригинал. Это одно за другим, то есть вы обращаетесь к одному элементу вне исходного массива. Это может привести к ошибке сегментации в зависимости от того, как new выкладывает кучу, но конечно это неопределенное поведение.

Другие вопросы по тегам