Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Странный "глюк" (???)

831
23 октября 2002 года
S_T
117 / / 23.10.2002
У меня MS VC++.NET
Я создаю класс:
class C3dObject
{
private:
int vallocated
...
public:
Vector *V;
C3dObject& operator =(const C3dObject&);
...
}
Реализация этого оператора:
C3dObject& C3dObject::operator =(const C3dObject&A)
{
...
V = new Vector[vallocated];
...
}
Так вот, после этого оператора, у меня V==NULL, хотя я выделяю порядка 9600 байт. Класс Vector - это
class Vector
{
public:
double x,y,z;
Vector(){x=0.0;y=0.0;z=0.0;};
~Vector(){};

+несколько перегруженных операторов
}
Я не могу понять, почему new не выделяет в операторе присваивания память? Уже несколько часов с этим делом парюсь.
2.1K
23 октября 2002 года
kmn
29 / / 09.10.2002
Цитата:
Originally posted by S_T
У меня MS VC++.NET
Я создаю класс:
class C3dObject
{
private:
int vallocated
...
public:
Vector *V;
C3dObject& operator =(const C3dObject&);
...
}
Реализация этого оператора:
C3dObject& C3dObject::operator =(const C3dObject&A)
{
...
V = new Vector[vallocated];
...
}
Так вот, после этого оператора, у меня V==NULL, хотя я выделяю порядка 9600 байт. Класс Vector - это
class Vector
{
public:
double x,y,z;
Vector(){x=0.0;y=0.0;z=0.0;};
~Vector(){};

+несколько перегруженных операторов
}
Я не могу понять, почему new не выделяет в операторе присваивания память? Уже несколько часов с этим делом парюсь.



Все работает как часики(см. ниже)
Може ты чего-нибуть не договариваешь?!

class Vector
{
public:
double x,y,z;
Vector(){x=0.0;y=0.0;z=0.0;};
Vector(double ax, double ay, double az){x=ax;y=ay;z=az;};
~Vector(){};
};

class C3dObject
{
protected:
int m_nAllocated;
Vector * m_pVectors;

public:
C3dObject() : m_nAllocated(0), m_pVectors(NULL)
{
}
~C3dObject()
{
delete [] m_pVectors;
}

// for example
C3dObject(const Vector& v) : m_nAllocated(3), m_pVectors(new Vector[3])
{
m_pVectors[0] = v;
m_pVectors[1] = v;
m_pVectors[2] = v;
}

const C3dObject& operator =(const C3dObject&A)
{
delete [] m_pVectors, m_pVectors = NULL;

m_nAllocated = A.m_nAllocated;
m_pVectors = new Vector[m_nAllocated];
for (int i = 0; i < m_nAllocated; i++)
m_pVectors = A;

return *this;
}

Vector operator [] (int i) const
{
return m_pVectors;
}
};

int _tmain(int argc, _TCHAR* argv[])
{
C3dObject a(Vector(-0.5, 0.7, 18));
C3dObject b;

b = a;

return 0;
}

831
24 октября 2002 года
S_T
117 / / 23.10.2002
У меня до сих пор ничего не работает, правда я заменил строку
V = new Vector[vallocated];
на строку
V = new Vector;//[vallocated];

и под этот один элемент у меня выделилась память. но далее по тексту программы, у меня есть выделение памяти под другой массив:

P = new Plane;//[pallocated];

здесь уже никак не работает (ни для всего массива, ни для одного элемента) Я не могу понять, может это у меня глючный компиллятор?
2.1K
24 октября 2002 года
kmn
29 / / 09.10.2002
Цитата:
Originally posted by S_T
У меня до сих пор ничего не работает, правда я заменил строку
V = new Vector[vallocated];
на строку
V = new Vector;//[vallocated];

и под этот один элемент у меня выделилась память. но далее по тексту программы, у меня есть выделение памяти под другой массив:

P = new Plane;//[pallocated];

здесь уже никак не работает (ни для всего массива, ни для одного элемента) Я не могу понять, может это у меня глючный компиллятор?

2.1K
24 октября 2002 года
kmn
29 / / 09.10.2002
Ты можешь показать полное описание классов???
831
25 октября 2002 года
S_T
117 / / 23.10.2002
Цитата:
Originally posted by kmn
Ты можешь показать полное описание классов???


Вот тут все есть:

831
25 октября 2002 года
S_T
117 / / 23.10.2002
Скажу еще один прикол. Так как я программист еще криворукий, то я сделал у себя в одном месте такой код:
spcount+=...
while(ospallocated<spcount)
{
if(ospallocated) delete pl;
ospallocated+=ALLOCUNITS;
pl=new SP_Plane[ospallocated];
}

так вот, у меня ospallocated до начала работы этого алгоритма равно 5, pl инициализировано каким-то ненулевым значением (это не мусор, а где то память под него уже выделилась). и тут у мен spcount становится равным, скажем так 100. Ну и мне конечно же под эти 100 элементов надо выделить память (не спорю, алгоритм дурацкий, но на нем я заметил такой баг (все еще в продолжении моей темы)): при ospallocated==10 (ALLOCUNITS==5) после pl=new ... у мен pl становится равным NULL. При ospallocated==15 pl у меня так же ноль, при 20, опять ноль. А теперь, на новой итерации цикла, при ospallocated==25, pl инициализируется каким то ненулевым значением!!! А при 30 (и далее до 100) у меня pl опять NULL. В чем прикол то, я не пойму???
2.1K
25 октября 2002 года
kmn
29 / / 09.10.2002
Цитата:
Originally posted by S_T
Скажу еще один прикол. Так как я программист еще криворукий, то я сделал у себя в одном месте такой код:
spcount+=...
while(ospallocated<spcount)
{
if(ospallocated) delete pl;
ospallocated+=ALLOCUNITS;
pl=new SP_Plane[ospallocated];
}

так вот, у меня ospallocated до начала работы этого алгоритма равно 5, pl инициализировано каким-то ненулевым значением (это не мусор, а где то память под него уже выделилась). и тут у мен spcount становится равным, скажем так 100. Ну и мне конечно же под эти 100 элементов надо выделить память (не спорю, алгоритм дурацкий, но на нем я заметил такой баг (все еще в продолжении моей темы)): при ospallocated==10 (ALLOCUNITS==5) после pl=new ... у мен pl становится равным NULL. При ospallocated==15 pl у меня так же ноль, при 20, опять ноль. А теперь, на новой итерации цикла, при ospallocated==25, pl инициализируется каким то ненулевым значением!!! А при 30 (и далее до 100) у меня pl опять NULL. В чем прикол то, я не пойму???



Скорее всего ты где-то выделил очень большой кусок памяти (скорее всего случайно)

попробуй все это в отдельном проекте

831
25 октября 2002 года
S_T
117 / / 23.10.2002
Цитата:
Originally posted by kmn


Скорее всего ты где-то выделил очень большой кусок памяти (скорее всего случайно)

попробуй все это в отдельном проекте


У меня есть некоторая переменная, ALLOCUNITS - в которой указывается, на сколько увеличивать размер массива, если к нему нужно добавить новые элементы. Так вот, при ALLOCUNITS==5 мне очень часто приходится перевыделять память (что собственно не работает), ну а если я задам ALLOCUNITS==100000 - то памяти на все хватает, перевыделения не происходит, и программа работает без глюков. Но ведь это же не хорошо так много памяти за раз кушать, тем более, если она в будущем не понадобится. Но я думаю, с этим глюком я так и оставлю.

2.1K
25 октября 2002 года
kmn
29 / / 09.10.2002
Цитата:
Originally posted by S_T

У меня есть некоторая переменная, ALLOCUNITS - в которой указывается, на сколько увеличивать размер массива, если к нему нужно добавить новые элементы. Так вот, при ALLOCUNITS==5 мне очень часто приходится перевыделять память (что собственно не работает), ну а если я задам ALLOCUNITS==100000 - то памяти на все хватает, перевыделения не происходит, и программа работает без глюков. Но ведь это же не хорошо так много памяти за раз кушать, тем более, если она в будущем не понадобится. Но я думаю, с этим глюком я так и оставлю.



Пришли код функции перевыделения памяти (ReAllocate)

831
26 октября 2002 года
S_T
117 / / 23.10.2002
Цитата:
Originally posted by kmn


Пришли код функции перевыделения памяти (ReAllocate)


Спасибо kmn за поддержку и сочуствие :0) Как я только что разобрался, ошибка не в компилляторе, не в алгоритме, а всего-лишь, в опечатке. (суть в том, что у меня есть массив вершин и полигонов, выделено памяти под вершины - содержится в vallocated а для полигонов - в pallocated. Дык вот, у меня в одном месте вместо pallocated было написано vallocated, в результате чего выделение памяти глючило по всей программе, и я искал ошибку в других местах, и только сейчас набрел на эту)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог