2016-03-29 19 views
2

私は、低レベルのテンプレートクラスと、このクラスのインスタンスへのポインタを含む別のクラスを持っています。コードが正しくコンパイルが、valgrindのを通してそれを実行しているとき、私は以下のエラーに遭遇:C++ - valgrindからの無効な削除

==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) 

あなたは以下のクラスファイルを見つけることができ、私はメモリの割り当てに関係のないコードを取り除かたことに注意してください。

ここではListクラスがあります。その後、

#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); 
} 

全体のプログラムが実行され、:

#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 

そして、最後に、主な方法:

#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 

ここOBJ3クラスですエラーが発生しました。あなたがint_arrayのためnew[]を使用しているため

答えて

4

あなたはdelete[]を使用する必要があります。

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

をところで:UB何をやっているです。 $ 5.3.5/2 [expr.delete](私が強調)削除:

最初の選択肢(削除対象)において、 削除のオペランドの値がヌルポインタ値、Aであってもよいです非配列オブジェクト へのポインタ、またはそのようなオブジェクトの基本クラスを表すサブオブジェクト (1.8)へのポインタ(第10項)。そうでない場合は、 の振る舞いはで、定義されていないのはです。あなたはあなたがそれを削除し、配列を作成する場合:

delete[] int_array; 

あなたが現在持っているもの:

delete int_array; 

しか指し示すポインタを削除しますエラーメッセージがあなたに手がかりを与えている

0

配列の先頭に移動します。

関連する問題