Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.08.2015, 04:57   #11
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Сообщение от gunsoy Посмотреть сообщение
Правильно ли я понял? Если я полностью избавлюсь от операций new/delete и заменю их на std::vector, то проблема исчезнет?
Зависит сугубо от Вашей писанины.
Croessmah вне форума Ответить с цитированием
Старый 14.08.2015, 09:28   #12
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,372
По умолчанию

Цитата:
Сообщение от gunsoy Посмотреть сообщение
заменю их на std::vector, то проблема исчезнет?
Не факт, ведь проблема может быть в том, что вы удаляете свой объект дважды. Я вам в самом начале сказал что делать.
waleri вне форума Ответить с цитированием
Старый 14.08.2015, 19:21   #13
gunsoy
Форумчанин
 
Регистрация: 30.12.2010
Сообщений: 280
По умолчанию

Дважды объект не удаляю. Попробую избавиться от всех операций new/delete.

Мне вот не понятно, как вот эту часть

Код:
//Данные беруться из файла
Textures = new float[TexturesSize];
is.read((char *) Textures, sizeof(float) * TexturesSize);
заменить на std::vector? Или заменить на какой-нибудь другой контейнер?
gunsoy вне форума Ответить с цитированием
Старый 14.08.2015, 19:41   #14
-=ЮрА=-
C/C++ advanced
Пользователь
 
Аватар для -=ЮрА=-
 
Регистрация: 17.11.2011
Сообщений: 17
По умолчанию

Цитата:
Правильно ли я понял? Если я полностью избавлюсь от операций new/delete и заменю их на std::vector, то проблема исчезнет?
- не избавишся, по описанию у тебя неверный дизайн, который приводит к двойному удалению, сейчас получаешь брейк внутри своего кода, потом будешь получать внтури throw алокатора std::vector. Без кода твою проблему никто не решит, будут только писать догадки
За "хлеб и воду" не работаю
-=ЮрА=- вне форума Ответить с цитированием
Старый 16.08.2015, 13:26   #15
gunsoy
Форумчанин
 
Регистрация: 30.12.2010
Сообщений: 280
По умолчанию

Вот что выводит отладчик

http://ipic.su/img/img7/fs/11.1439719976.png

http://ipic.su/img/img7/fs/22.1439720172.png

http://ipic.su/img/img7/fs/33.1439720290.png

В строках 8, 9, 10 отладчик указывает на файл stl_vector.h.

Внутри класса Map много векторных данных. Мне не понятно отладчик говорит что проблема с каким-то вектором (членом класса Map)? Не разбираюсь я в сообщениях отладчика=(
gunsoy вне форума Ответить с цитированием
Старый 16.08.2015, 14:43   #16
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,091
По умолчанию

Тут уже всё упало в векторе, толку от этой отладки ноль.
Берем проблемный деструктор. Ставим бряк (breakpoint, точка останова) на первую строку, построчно выполняем деструктор, пока не узнаем в какой именно строке падает. Смотрим чего происходит в этой строке, переходим в вызываемый в ней метод и так же построчно смотрим где именно падает. Таким образом узнаем при какой именно операции что-то идёт не так. От того, что сейчас что-то там падает в недрах вектора ни холодно, ни жарко. Нужно определить при удалении каких именно данных всё падает и потом смотреть кто еще эти данные трогает и кто их мог поломать. Можно вообще проблемное удаление пока закомментить (хоть всё тело деструктора), чтобы посмотреть будет ли что-то еще сыпаться.

Последний раз редактировалось pu4koff; 16.08.2015 в 14:47.
pu4koff вне форума Ответить с цитированием
Старый 17.08.2015, 13:25   #17
gunsoy
Форумчанин
 
Регистрация: 30.12.2010
Сообщений: 280
По умолчанию

pu4koff

Сделал как посоветовали. Если breakpoint стоит где-то внутри деструктора, то segmentation fault не происходит. По ходу действительно объект удаляется дважды. Только вот как так происходит что он удаляется дважды я так и не понял. Если деструктор закоментировать, то segmentation fault происходит в объявлении класса, тут
Код:
class Map
на самой первой строке класса.

не избавишся, по описанию у тебя неверный дизайн, который приводит к двойному удалению

Вот код работы с классом Map * Karta;

Код:
while(Running)
{
    ....
    if(Karta.GetBoolEnd())
    {
        Running = false;
        delete Karta;
    }
}
Есть у меня главный класс коротко class A, внутри которого запускается класс B. Внутри класса B запускается класс Map. Приведённый выше код это в классе B. Класс B работает пока Running == true;

Коротко описал дизайн кода. Сам в правильности дизайна не разбираюсь=(
gunsoy вне форума Ответить с цитированием
Старый 17.08.2015, 14:12   #18
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,372
По умолчанию

Отладчик должен уметь показывать call stack.
Ставьте breakpoint в деструкторе и смотрите по стеку откуда идут вызовы удаления.
waleri вне форума Ответить с цитированием
Старый 17.08.2015, 14:21   #19
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,091
По умолчанию

Цитата:
Сообщение от gunsoy Посмотреть сообщение
pu4koff

Сделал как посоветовали. Если breakpoint стоит где-то внутри деструктора, то segmentation fault не происходит. По ходу действительно объект удаляется дважды. Только вот как так происходит что он удаляется дважды я так и не понял.
Конструкторы копии везде реализованы свои с правильным поведением?
pu4koff вне форума Ответить с цитированием
Старый 18.08.2015, 18:18   #20
gunsoy
Форумчанин
 
Регистрация: 30.12.2010
Сообщений: 280
По умолчанию

Цитата:
Конструкторы копии везде реализованы свои с правильным поведением?
У меня есть копия класса Map

Вызываю внутри класса Map. Функции передаю указатель this на данный класс чтобы можно было работать с этим классом из другого потока.
Код:
threadMusic = SDL_CreateThread(thread_music3, "thread_music3", this);
Вот код самого потока
Код:
int thread_music3(void *Loc)
{
    Map * locat = (Map *) Loc;
    while(locat->Running2)
    {
        if(locat->strMusic.length() > 0)
        {
            int milisec = 0;
            if(locat->strMusic == "gaudio/hod.wav")
            {
                milisec = 5000;
            }
            else if(locat->strMusic == "gaudio/effect.wav")
            {
                milisec = 500;
            }
            else if(locat->strMusic == "gaudio/sell.wav")
            {
                milisec = 600;
            }
            SDL_Init (SDL_INIT_AUDIO);
            Mix_OpenAudio (44100, MIX_DEFAULT_FORMAT, 2, 1024);
            Mix_Music *music;
            music = Mix_LoadMUS (locat->strMusic.c_str());
            Mix_PlayMusic (music, -1);
            SDL_Delay(milisec);
            Mix_CloseAudio();
            locat->strMusic = "";
        }
    }
    std::cout << "\n\n\nTHREAD_____MUSIC_____DEAD";
    std::cout << "\nTHREAD_____MUSIC_____DEAD_____END";
}
Проверял поток, он успевает завершить работу перед тем как класс удаляется. То есть выводит "THREAD_____MUSIC_____DEAD".

Пробовал также запускать программу с закоментированным
Код:
//threadMusic = SDL_CreateThread(thread_music3, "thread_music3", this);
Не помогло.

Не знаю что означает "с правильным поведением".
gunsoy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ vector segmentation fault Misa Помощь студентам 4 08.01.2015 19:02
Segmentation fault Hemul Общие вопросы C/C++ 7 16.08.2011 03:23
Vector, Pair и segmentation fault certman Общие вопросы C/C++ 3 25.03.2010 00:24
QT4 segmentation fault jojahti Qt и кроссплатформенное программирование С/С++ 6 06.01.2010 09:57
GCL и segmentation fault. jojahti Свободное общение 0 14.09.2009 19:20