проблема с передачей пользовательского массива в функцию (c ++) - PullRequest
0 голосов
/ 04 июня 2011

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

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

После того, как я закончу добавлять целые числа, я хочу использовать тот же массив обратно в Main.

Кто-нибудь знает, что не так с кодом?

Спасибо, Макс

template<class T> int CFile<T>::read(T **apBuf, int aNum)
{
int readCounter = 0;

*apBuf = (T*)malloc(sizeof(T)*aNum);


for (int i = 0; i<aNum; i++)
{
    T var = read();

    if (var == NULL)
    {
        if (isEof)
        {

            return readCounter;
        }
        else
        {
            perror ("Error Reading File - Insufficient var type");
            return -1;
        }
    }
    else
    {   
        *apBuf[i] = var;

        readCounter++;
    }
}



return readCounter;

}

Ответы [ 3 ]

2 голосов
/ 04 июня 2011
*apBuf[i] = var;

Это анализируется, как если бы было написано:

*(apBuf[i]) = var;

Это явно не то, что вы хотите; apBuf - указатель на указатель на массив; вы рассматриваете его как указатель на массив и разыменовываете i-й элемент этого массива. Что вы на самом деле имеете в виду:

(*apBuf)[i] = var;

*apBuf дает вам «объект, на который указывает apBuf», который является массивом; тогда вы получите i элемент массива.

Тем не менее, это довольно необычно: почему бы не собрать данные в std::vector<T> и не вернуть их из функции? Тогда вам не нужно беспокоиться о явном динамическом управлении памятью. (Кроме того, T всегда является указателем типа? Если нет, то var == NULL не имеет смысла.)

1 голос
/ 04 июня 2011

Ну, вы использовали malloc для выделения массива, а затем попытались присвоить ему.Это неопределенное поведение, потому что вы должны создавать объекты.

О, и вам следует действительно , действительно рассмотреть возможность использования классов-собственников, поскольку malloc иэтот стиль программирования вообще ужасно небезопасен.Что если конструктор копирования T сгенерирует исключение?Утечка памяти.Просто для примера.

0 голосов
/ 04 июня 2011

Одна из проблем, с которой вы столкнулись - это использование malloc вместо new.Если T является классом, конструктор не будет вызван.

...