2015-09-11 18 views
5

statik kodu aşağıdaki hata tespit etmek için,

bir yol var TLDR (dökme için işaretçisi operatörü ile) yığın değişken silme çağrı Algılama? Sadece bir kullanıcı tanımlı dönüşüm içeren * geçersiz için Foo bir dönüşüm olmadığı

struct Foo 
{ 
    operator const int*() 
    { 
     return &data; 
    } 

    int data; 
}; 

int main() 
{ 
    Foo f; 
    delete f; 
} 

, aslında f üzerinde delete aramaya izin verilir.

uzun hikaye bizim kod temeli

, pseudocode, serisi kaldırılmaya dizeleri gerçekten aptal yolu vardı

char * buff = bar.loadString(); 
use buff; 
delete buff; 

yolu, bir şablon yük işlevine, değiştirildi, şimdi görünüyor serisini

bar.load(m_IntMember); 
bar.load(m_StringMember); 

ancak tüm oluşumları gibi loadString ait (birçoğu oldu) Hepimizin insan hatası neden olabilir biliyorum, bu yüzden biraz olmayan kullandığınız beri kod yanlış

string buff; 
bar.load(buff); 
use buff; 
delete buff;  //notice the delete 

gibi modifiye edilmiş yerler vardır

string buff; 
bar.load(buff); 
use buff; 

: manuel böyle değiştirilmesine vardı string standart uygulaması aslında silinebilir void* için dökülebilir bir overloaded const char * operator ... vardır

biz özel yüksek performanslı alloca'yı var (derleme sırasında bu hataların hepsi yakalamak istiyoruz zamanında böylece ları, bu) herhangi bir çalışma zamanı hata olmadan bozuk belleğe kolaydır

o derlemek edemiyor bu yüzden, yoğun olarak kullanılmaz çünkü const char* geçici olarak string gelen işleci silmek silemezsiniz kabul küresel delete operatörünü beyan edemez olmadan

ne yapabilirim (hataların belirli miktarda ulaşan zaman msvc derleme durur çünkü bütün hatalardan açıklanan hata "filtre" olamaz)?

+0

Bu ayırt etmek mümkün değildir. Akıllı bir işaretçi kullanın. –

+0

'const char *', 'const' -ess'i kaybettiğinden dolaylı olarak void * 'ye dönüştürülemez. 'Const void * 'öğesine dolaylı olarak dönüştürülebilir, ancak bu' delete 'için yasal bir argüman olmamalıdır. Açıkça bir yere mi dökülüyorsun? Ürün iadesinin 'const int * için örnek değiştirdiğinizde ona @jamesdlin – jamesdlin

+0

iyi derler' Ben delete' 'hakkında yanlış değilim, Ah http://ideone.com/aL23m2 – relaxxx

cevap

2

Bu bunu yapmak için görünüyor: g ++ ile bu derleniyor

#include <iostream> 

struct Foo 
{ 
    Foo() : data(42) {} 

    operator const int*() 
    { 
     return &data; 
    } 

    int data; 

    struct AmbiguousPointerConversion {}; 
    private: operator AmbiguousPointerConversion *() { 
     throw "hi"; 
    } 
}; 

int main() 
{ 
    Foo f; 
    const int *p = f; 
    std::cout << *p << '\n'; 
    delete f; 
} 

bana verir:

try.cc: In function ‘int main()’: 
try.cc:25:12: error: ambiguous default type conversion from ‘Foo’ 
    delete f; 
      ^
try.cc:25:12: note: candidate conversions include ‘Foo::operator const int*()’ and ‘Foo::operator Foo::AmbiguousPointerConversion*()’ 
try.cc:25:12: error: type ‘struct Foo’ argument given to ‘delete’, expected pointer 
+1

Her iki dönüşüm de muhtemelen const olmalıdır, ancak kesinlikle aynı olmalıdır. "Const" üzerinde aşırı yüklenme ile kasten belirsizliğin çözülmesini istemezsiniz. – MSalters

İlgili konular