2016-03-29 24 views
2

Düşük düzeyli bir şablon sınıfına ve bu sınıfın bir örneğine işaretçi içeren başka bir sınıfa sahibim. kodu doğru derler ama valgrind aracılığıyla çalıştırırken aşağıda yanılgıya çalıştırın:C++ - Geçersiz değer silme

==2642== Invalid free()/delete/delete[]/realloc() 
==2642== at 0x4C2A360: operator delete(void*) (vg_replace_malloc.c:507) 
==2642== by 0x4125B4: List<std::string>::~List() (in /home/alex/Documents/Documents/cpp/object_module/obj_test) 
==2642== by 0x411CB0: Obj3::~Obj3() (in /home/alex/Documents/Documents/cpp/object_module/obj_test) 
==2642== by 0x410AC1: main (in /home/alex/Documents/Documents/cpp/object_module/obj_test) 
==2642== Address 0x5a02878 is 8 bytes inside a block of size 88 alloc'd 
==2642== at 0x4C298A0: operator new[](unsigned long) (vg_replace_malloc.c:389) 
==2642== by 0x4124FE: List<std::string>::List() (in /home/alex/Documents/Documents/cpp/object_module/obj_test) 
==2642== by 0x411BC6: Obj3::Obj3(std::string, std::string, std::string, std::string, std::string) (in /home/alex/Documents/Documents/cpp/object_module/obj_test) 
==2642== by 0x41065A: main (in /home/alex/Documents/Documents/cpp/object_module/obj_test) 

Aşağıdaki sınıf dosyaları bulabilirsiniz, ben hafıza ataması ile ilgili olmayan kodunu kaldırdık unutmayın. Son olarak, ana yöntem

#ifndef OBJ3_H 
#define OBJ3_H 

#include <string> 
#include "list.h" 

class Obj3 
{ 
    private: 
     //A list of scenes 
     List <std::string> *scene_list; 
     ... 
    public: 
      //Constructors & Destructor 
      Obj3() {scene_list = new List <std::string>;} 
      ~Obj3() {delete scene_list;} 
      ... 
#endif 

Ve:

İşte Obj3 sınıfı var
#ifndef LIST_H 
#define LIST_H 

template <class T> 
class List 
{ 
    T *int_array; 
    ... 
    public: 
    List() {int_array=new T[10];} 
    ~List() {delete int_array;} 
    ... 
}; 
#endif 

: Burada

Liste sınıfı var

#include "obj3.h" 

void print_obj_attributes(Obj3& obj) 
{ 
std::cout << obj.get_name() << std::endl; 
... 
} 

int main() 
{ 
Obj3 obj2; 
std::cout << "Object 2" << std::endl; 
print_obj_attributes(obj2); 
} 

Tüm programı çalıştırır ve sonra hatayla karşılaşıldı. Eğer int_array için new[] kullanılan çünkü

cevap

4

Sen delete[] kullanmalıdır:

... 
public: 
    List() {int_array=new T[10];} 
    ~List() {delete[] int_array;} 
       ~~ 
... 

BTW: UB Yaptığın şey olduğunu. $ 5.3.5/2 [expr.delete] (benim vurguladığı) Sil:

Birinci alternatifte

(silme nesne), arasında işlenen değerini bir boş gösterici bir değer olabilir, silebilir, sıra dışı bir nesne , bir önceki yeni ifadeyle veya böyle bir nesnenin temel bir sınıfını temsil eden bir alt nesne (1.8) işaretçisini oluşturmuştur (Madde 10). Değilse, davranışı tanımsızdır. Hata mesajı size ipucu veriyor

0

:

delete[] int_array; 

şu anda sahip Ne:

delete int_array; 

sadece işaretçisini silmek Will Bir dizi oluşturmak eğer birlikte silmek dizinin başına.

İlgili konular