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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2011, 17:14   #1
pronaks
 
Регистрация: 18.11.2010
Сообщений: 9
По умолчанию Ошибка при добавление элементов в контейнер

Первый раз сталкиваюсь с таким, не первый раз использую контейнер vector. Но при добавлении в него элемента вылетает странный меседж.
Цитата:
ОС Windows инициировала точку останова в fff.exe.

Это может быть вызвано повреждением кучи и указывает на ошибку в fff.exe или в одной из загруженных им DLL.

Возможной причиной так же может быть нажатие пользователем клавиши F12, когда фокус принадлежит fff.exe

Выведенное на экран окно содержит дополнительные данные для диагностики ошибки
Не могу понять, что не так.
pronaks вне форума Ответить с цитированием
Старый 14.12.2011, 17:39   #2
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

А какой вы рассчитываете услышать ответ?
Такая ошибка может возникнуть из-за миллиона причин. Можете начать проверять их все, начиная с первой, или показать код
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 14.12.2011, 19:13   #3
pronaks
 
Регистрация: 18.11.2010
Сообщений: 9
По умолчанию

Просто точно с таким же кодом в прошлых программах все работало.
Есть класс Answer

Answer.h
Код:

#pragma once
#include <iostream>
#include <string>
class Answer
{
private:
	char* _answer;
	bool _correct;
public:
	Answer(char* answer, bool correct);
	~Answer(void);
	char* GetAnswer(){ return this->_answer; }
	void SetAnswer(char* answer) { this->_answer = answer; }
	bool GetCorrect() { return this->_correct; }
	void SetCorrect(bool correct) { this->_correct = correct; }
};
Его реализация:

Answer.cpp
Код:

#include "Answer.h"


Answer::Answer(char* answer, bool correct)
{
	this->_answer = (char*)malloc(24);
	this->_answer = answer;
	this->_correct = correct;
}


Answer::~Answer(void)
{
	free(this->_answer);
}
И есть класс TestItem


TestItem.h
Код:
#pragma once
#include "Answer.h"
#include <vector>
#include <iostream>

using namespace std;

class TestItem
{
private:
	char* _question;
	vector<Answer> _answers;
public:
	TestItem(void);
	TestItem(char* testitem);
	~TestItem(void);
	char* GetQuestion() { return this->_question; }
	void SetQuestion(char* question) { this->_question = question; }
	vector<Answer> GetAnswers() { return this->_answers; }
	void AddAnswer(Answer answer);
	void ViewTestItem();
};
И когда я вызываю метод:
Код:
void TestItem::AddAnswer(Answer answer)
{
	this->_answers.push_back(answer);
}
pronaks вне форума Ответить с цитированием
Старый 14.12.2011, 20:02   #4
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

У вас не корректно копируется класс Answer. Напишите конструктор копии, который делает глубокое копирование, т.е. заново выделяет память для _answer. В текущей версии работает конструктор копии по-умолчанию, который просто копирует адрес указателя, в итоге получается, что все скопированные объекты класса Answer имеют указатель на одно и тоже место в памяти для члена _answer, следовательно как только в одном из объектов этот указатель освободится, все остальные начнут работать с не валидным адресом
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 14.12.2011, 21:54   #5
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

pronaks

Не могу понять, что не так.

Не так то, что ты не умеешь работать с указателями и динамической памятью.
Rififi вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
power builder ошибка при добавление записи в таблицу world12_tk Помощь студентам 0 11.04.2011 21:25
Запись элементов перечисления в контейнер List malinoff Помощь студентам 3 28.02.2011 16:58
Ошибка при добавление записи killas966 Помощь студентам 0 06.12.2010 13:52
Добавление элементов управления при измененном масштабе Fierce Microsoft Office Excel 0 18.03.2010 21:35
Ошибка при добавление данных в TTable Utkin БД в Delphi 19 21.04.2009 18:33