Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Выдиление памяти в классе


Автор: Toohtik 18.10.2007, 11:22
Помогите найти ошибку в коде:
Код

#pragma once
#include <windows.h>


class PlanThread
{
private:
    struct SEGMENTINFO
    {
        int                    nSegmentNumber;
        HANDLE                hThread;
        int                    nSegmentState;
    };
    int                        GetFreeSegment();
    SEGMENTINFO*            m_pSegmentInformation;                       //информация о сегменте

public:                                                                                                                                                               
    __int64                    m_nSum;                           //сумма чисел
    int                        m_nCountSegment;                                                        //количество сегментов
    LPTHREAD_START_ROUTINE    m_lpStartAdress;
    
    PlanThread()
        : m_pSegmentInformation(NULL)
        , m_nSum(0)
        , m_nCountSegment(0)
        , m_lpStartAdress(0)
    {}
    
//    ~PlanThread()
//    {
//        if(m_pSegmentInformation)
//            free(m_pSegmentInformation);
//    }
    void                CreateThreads();
    void                DeleteThread();
};

#include "PlanThread.h"

int PlanThread::GetFreeSegment()
{

    if(m_pSegmentInformation)
    {
        for(int nCounter = 0; nCounter < m_nCountSegment; nCounter++)
            if(m_pSegmentInformation[nCounter].nSegmentState == 3)
                return nCounter;
    }
    m_nCountSegment++;
    m_pSegmentInformation = (SEGMENTINFO*)realloc(m_pSegmentInformation,m_nCountSegment*sizeof(SEGMENTINFO));
    return m_nCountSegment;

    return -1;
}

void PlanThread::CreateThreads()
{
    int nFreeSegment = GetFreeSegment();
    m_pSegmentInformation[0].nSegmentNumber = nFreeSegment;
    m_pSegmentInformation[0].nSegmentState = 1;
    m_pSegmentInformation[nFreeSegment].hThread = CreateThread(NULL,NULL,m_lpStartAdress,&nFreeSegment,NULL,NULL);
}

Ошибка заключается в том, что при втором запуске функции CreateThread прога вылетает 
Код

m_pSegmentInformation = (SEGMENTINFO*)realloc(m_pSegmentInformation,m_nCountSegment*sizeof(SEGMENTINFO));

Именно на втором вызове, т.е. первый вызов функции происходит успешно

Автор: Lazin 18.10.2007, 12:11
А где выделяется память под m_pSegmentInformation, возможно второй раз в realloc передается битый указатель.

Автор: Toohtik 18.10.2007, 12:25
В смысле  битый указатель? При вызове функции GetFreeSegment вызывается память под один элемент типа SEGMENTINFO и т.д.

PS извиняюсь за грамматическую ошибку в названии темы

Автор: Lazin 18.10.2007, 12:39
Цитата(Toohtik @  18.10.2007,  12:25 Найти цитируемый пост)
В смысле  битый указатель?

В смысле указатель на удаленный блок памяти.

Автор: Toohtik 25.10.2007, 20:30
Думаю нет, т.к. в этом коде ничего не может удалить указатель. Просто я где то ошибку допускаю и все...

Автор: JackYF 26.10.2007, 15:47
Стоп, эээ. Где проверяется значения указателя, который вернула realloc? realloc не обязана возвращать валидный указатель, она лишь хочет это сделать!

Ну и это, блин. Отладчиком пользуешься?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)