LINUX.ORG.RU

Ответ на: комментарий от alex_custov

>ЕМНИМ, gcc инициализирует указатели нулевым указателем.

А даже если не низменяет, там всё равно сегфолт должен быть. Вообще, если у программера вместо мозгов метан, то у него и bash в сегфолт улетит. Не C++ тут виноват. )

devinull ★★
()
Ответ на: комментарий от devinull

>>А даже если не низменяет, там всё равно сегфолт должен быть

delete 0; - это как в асме nop, никакого сегфолта там не должно быть ;)

alex_custov ★★★★★
()
Ответ на: комментарий от alex_custov

не должно. он будет при ((QString*)0)->~QString() - легко.

devinull ★★
()
Ответ на: комментарий от alex_custov

даже если это и так, то не всёж патрекоугодным компалйлером компилить, Qt вообще и под МСВС компилится, а он в Release ржиме не инициализирует переменные.

theos ★★★
()
Ответ на: комментарий от alex_custov

> delete 0; - это как в асме nop, никакого сегфолта там не должно быть ;)

В общем такая программка на gcc4.2 с треском упала ::))

А если сделать так:

QString* str = 0; delete str;

то всё нормально.

Но всё равно лучше проверить на ноль и после удаления обнулить. Для автоматизации этого в qt даже есть qpointer.

anonymous
()
Ответ на: комментарий от Zuljin

> // Put this to some secluded nook
template< typename T >
T* B6085443BCE84d0489BD76C74663E951( T* p )
{
static T* q = p;
T* const result = q == p ? p : q;
q = p;
return result;
}

#define this B6085443BCE84d0489BD76C74663E951( this )
// Happy debugging!

Что за изврат с q == p ? p : q;?
Проще result = q;

cvs-255 ★★★★★
()
Ответ на: комментарий от cvs-255

>Что за изврат с q == p ? p : q;? 
>Проще result = q;

Не проще. q - статический указатель, который инициализируется при первом вызове функции. 
То есть, как только ты один раз вызовешь this->чего-нибудь, этот шаблон 
захавает адрес объекта, и все последующие вызобы this->чего-то 
будут работать с только тем же объектом, независимо от того, на this должен 
указывать Отлаживать правда долго. =)

template< typename T > 
T* B6085443BCE84d0489BD76C74663E951( T* p ) 
{ 
 static T* q = p; 
 T* const result = q == p ? p : q; 
 q = p; 
 return result; 
} 
#define this B6085443BCE84d0489BD76C74663E951( this ) 

struct A
{
	int a;
	void f() { cout << this->a << endl; }
};

int main()
{
	A a,b;
	a.a = 0;
	b.a = 1;
	b.f();
	a.f();
}

выведет 1 1, вместо 1,0

devinull ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.