Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выдиление памяти в классе 
:(
    Опции темы
Toohtik
Дата 18.10.2007, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 142
Регистрация: 30.1.2006
Где: Харьков

Репутация: нет
Всего: нет



Помогите найти ошибку в коде:
Код

#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));

Именно на втором вызове, т.е. первый вызов функции происходит успешно
PM ICQ   Вверх
Lazin
Дата 18.10.2007, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



А где выделяется память под m_pSegmentInformation, возможно второй раз в realloc передается битый указатель.
PM MAIL Skype GTalk   Вверх
Toohtik
Дата 18.10.2007, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 142
Регистрация: 30.1.2006
Где: Харьков

Репутация: нет
Всего: нет



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

PS извиняюсь за грамматическую ошибку в названии темы
PM ICQ   Вверх
Lazin
Дата 18.10.2007, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



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

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

PM MAIL Skype GTalk   Вверх
Toohtik
Дата 25.10.2007, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 142
Регистрация: 30.1.2006
Где: Харьков

Репутация: нет
Всего: нет



Думаю нет, т.к. в этом коде ничего не может удалить указатель. Просто я где то ошибку допускаю и все...
PM ICQ   Вверх
JackYF
Дата 26.10.2007, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



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

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


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0757 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.