powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / выделение памяти
7 сообщений из 7, страница 1 из 1
выделение памяти
    #34497817
guested
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем!

Пишу на VS2005, C++, Win32.

Проблема:
Делаю примерно такую вещь:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
class A {
	public: A() {}; ~A() {};
}
class C;
class B {
	public: B() {}; ~B() {};
	void init C_A() { C->a = new A(); }
}
class C{
	public: С() {}; ~С() {};
	A *a;	
}
После иницииализации в "B" в "С->a" периодически оказывалась ерунда.

Также:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
class someclass {
	typedef int* pint;
	static int fun1(pint &A, int rng) {
		A = (pint)malloc(sizeof(int) * rng); // *
		// some code
	}
	static int fun2(pint &A) {
		int *A = NULL; fun1(A,  10 );	
		// some code
		if (A) free(A);
	}
}
Время от времени выдает ошибки на выделение памяти (*). Причем
случайные - то работает, то нет.

Никто ничего не слышал на этот счет?

Заранее признателен за комментарии. автор автор[SRC c++][/SRC]
...
Рейтинг: 0 / 0
выделение памяти
    #34497874
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В первом исходнике инициализации экземпляра "*a" вообще не происходит.

Во втором исходнике проблема обозначена неясно. Что за ошибки. Утечка? Нехватка? И вообще код написан "подозрительно". Хотелось-бы узнать почему автор решил использовать ссылочные переменные.
...
Рейтинг: 0 / 0
выделение памяти
    #34497896
guested
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем, в первом случае создаются объекты "B" и "С" ("С" - без инициализации атрибута типа "A"), затем для объекта типа "B" вызывается метод, который инициализирует "C->a".

Ссылочные переменные - почему бы и нет?

В функцию передал адрес, а не указатель - для сокращения записи.

Может быть конечно это рикошет от других ошибок в коде. Сейчас не уверен.
...
Рейтинг: 0 / 0
выделение памяти
    #34497900
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guestedВ общем, в первом случае создаются объекты "B" и "С" ("С" - без инициализации атрибута типа "A"), затем для объекта типа "B" вызывается метод, который инициализирует "C->a".


1) Кто и где будет вызывать метод init?


Может быть конечно это рикошет от других ошибок в коде. Сейчас не уверен


2) Давайте достигнем стабилизации ошибки. Тоесть я прошу вас создать ситуацию, когда ошибка 100% возникает при каждом запуске. Тогда мы сможем её идентифицировать. В противном случае - выходит, что мы занимаемся "черной магией".
...
Рейтинг: 0 / 0
выделение памяти
    #34497955
guested
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подкорректирую код для первого случая:
[source]
class A {
public: A() {}; ~A() {};
}
class C;
class B {
public:
C* cl;

B(C*c) { cl = c; };
~B() { if(cl->a) delete cl->a; };

void init_C_A() { cl->a = new A(); }
}
class C{
public: С() {}; ~С() {};
A *a;
}

C* cg = new C();
B* bg = new B(cg);

cg->init_C_A();
// что-нибудь делаем с "bg->a"

delete bg;
delete cg;
[/source]

Ошибка никуда от меня не денется -)

В общем, в чем суть - нет ли на этот счет чего-нибудь вроде опций компилятора или багов в билдах?

PS. Первая ситуация не очень интересна. Более интересна инициализация массива в функции, в которую передан его адрес.
...
Рейтинг: 0 / 0
выделение памяти
    #34498278
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну баенька с таким обращением с объектами в хипе, ничего удивительного нет. Раздолбал таблицу размещения malloc и удивляешься.
...
Рейтинг: 0 / 0
выделение памяти
    #34499836
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
	 B(C*c) { cl = c; }; 
	~B()    { if(cl->a) delete cl->a; };
	
	void init_C_A() { cl->a = new A(); }
}
class C{
	public: С() {}; ~С() {};
	A *a;	
}
а это не должны быть ошибки времени компиляции? Идентификатор «а» вне поля видимости.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / выделение памяти
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]