Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Технологии > Помощь студентам
Регистрация

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

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 14.06.2008, 14:16   #1
rJIaBkoM
Новичок
Джуниор
 
Регистрация: 14.06.2008
Сообщений: 1
По умолчанию Проблема с памятью в С++

Народ помогите кто чем может. Значит проблема у меня состоит в следующем. Есть класс. В этом классе есть объект, который имеет 2 поля: строка и массив(статич.). Так вот мне надо сделать так чтобы через созданное мной меню при выборе опции удаления я вводил слово, которое следует удалить, оно сравнивалось с теми, которые уже есть в классе и при совпадении удалялся весь объект. Я думаю это все надо делать через деструктор, но вот как не пытался вылетает критическая ошибка. Вот листинг:
Код:
class Pred{
private:
	char* word;
	int N[10];
public:
	Pred();
	Pred(char* w, int* N);
	~Pred();
	char* get_word() {return word;};
	int* get_N() { return N; };
	void input();
	void output();
};
int main(){
	char choise;
	int n;
	char* slovo;
	slovo = new char[10];
	Pred *A;
	cout << "Vvedite kolvo ob'ektov: ";
	cin >> n;
	A = new Pred[n];
	do{
		cout<<"Viberite metod: \n";
		cout<<" 1. Vvod ykazatelya:\n";
		cout<<" 2. Vivod ykazatelya:\n";
		cout<<" 3. Vivod nomerov stranic dlya zad. slova:\n";
		cout<<" 4. Ydalenie ykazatelya:\n";
		cout<<"Vixod(q):";
		cin>>choise;
			if(choise=='1'){
				cout << "------------------------------------"<<endl;
				cout << "             BBOD:" << endl;
				for(int i=0;i<n;i++)
				A[i].input();
				cout << endl;
			} 
			else
				if(choise=='2'){
				cout << "------------------------------------"<<endl<<endl;
				cout << "             BBIBOD:" << endl;
				for(int i=0;i<n;i++){
				A[i].output();
				cout << endl;
				}
			}
			else
				if(choise=='3'){
				cout << "------------------------------------"<<endl<<endl;
				cout << "             BBIBOD PO SLOVY:" << endl;
				cout << "Vvedite slovo: "; 
				cin >> slovo;
				cout << endl;
				int f=0;	
				for(int i=0;i<n;i++){
						if(!strcmp(A[i].get_word(), slovo)){
							A[i].output();
						}
						else { 
							if(strcmp(A[i].get_word(),slovo))
							f++;
							continue;
						}
					}
				if(f==n){
					cout << "Net takogo slova!!" << endl;
				}
				cout << endl;

			}
			else
				if(choise=='4'){
					cout << "             YDALENIE SLOVA:" << endl;
					cout << "Vvedite slovo, kotoroe sledyet ydalit': ";
					cin >> slovo;
				int f=0;	
					for(int i=0;i<n;i++){
						if(!strcmp(A[i].get_word(), slovo)){
							delete &A[i];
						}
						else { 
							if(strcmp(A[i].get_word(),slovo))
							f++;
							continue;
						}
					}
					if(f==n){
						cout << "Net takogo slova!!" << endl;
					}
					cout << endl;
				}
			else
				if(choise=='q'){
				break;
			}
	}
//Реализация деструктора:

Код:
Pred::~Pred(){
	delete [] word;
}
Заранее благодарю. Думаю для великих программеров это не будет являться проблемой.
rJIaBkoM вне форума Ответить с цитированием
Старый 14.06.2008, 14:25   #2
Olympian
Форумчанин
 
Аватар для Olympian
 
Регистрация: 06.06.2008
Сообщений: 105
По умолчанию

Хм -
Неверно сделал по-моему вот это - само удаление

if(!strcmp(A[i].get_word(), slovo)){
delete &A[i];

ты нашел такой элемент, но ты не можешь его просто прямо удалить.
А если он - 1й в массиве?тогда ты просто обрубишь весь массив сразу

Да и мне кажется, поскольку ты делал массив функцией new - то за A закреплено уже фиксированное количество байт. И если ты так удалишь 1н элемент - ничего не изменится.
Как вариант, если тебе надо именно удалить, создаешь временный массив, копируешь туда всё что надо, удаляешь весь массив A и копируешь в него временный.
А иначе - можно просто этот элемент убрать на последнее место в массиве, и n - счетчик кол-ва элементов - уменьшить на 1. И тогда "удаленные" просто не будут обрабатываться
Olympian вне форума Ответить с цитированием
Ответ
Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с памятью процесса JRcoker Win Api 10 18.07.2009 22:22
динамическое управление памятью oblom Общие вопросы C/C++ 12 16.02.2008 16:24
Что будет с выделенной памятью? Sibedir Общие вопросы Delphi 9 18.01.2008 14:57
Работа с памятью Shurik Hacker Общие вопросы Delphi 7 22.06.2007 20:51