2016-10-26 15 views
0

独自のバージョンのベクターをC++で実装しようとしています。 これまでのところ、私はC++でベクタを実装しているときにランタイムエラーが発生する

#include<iostream> 
#include<string> 

using namespace std; 


template<class T> 
class vec 
{ 
public: 
    T *a; 
    int i,N; 
    vec(int N=0):N(N) 
    { 
     i=-1; 
     a=(T *)malloc(N*sizeof(T)); 
    } 
    void push_back(const T& t); 
    T at(const int& index) const; 
}; 

template<class T> 
void vec<T>::push_back(const T& t) 
{ 
    if(++i==N) 
    { 
     a=(T *)realloc(a,(++N)*sizeof(T)); 
    } 
    a[i]=t; 
} 

template<class T> 
T vec<T>::at(const int& index) const 
{ 
    return a[index]; 
} 

int main() 
{ 
    vec<string> v; 
    v.push_back("2"); 
    v.push_back("1"); 
    v.push_back("3"); 
    cout<<v.at(0)<<endl; 
    return 0; 
} 

。これを行っている。しかし、私はこの を実行したときに、私は、実行時エラーを取得していますどこに上記のコードではエラーがありますか? 私はC++とVisual Studioを使用して実行しています。

+2

deleteとmallocは一緒に実行されません。あなたは自由であるか新しいかを望みます – UKMonkey

+1

'malloc'(と' realloc')関数は*メモリにのみ割り当てます。彼らはコンストラクタを呼び出さない。 'malloc'を使ってコンストラクタを持つオブジェクトにメモリを割り当てると、すべてのオブジェクトを手動で調べて明示的に構築しない限り、うまく動作しません。 –

+0

どうすればいいですか? – MysticForce

答えて

0

この場合、新しいプレースメントを使用する必要があります。

このような何か:

// Allocate memory 
void* mem = malloc(sizeof(std::string)); 

// Call constructor via placement new on already allocated memory 
std::string* ptr = new (mem) std::string(); 

しかし、その後、あなたが明示的にこのメモリ

ptr->~std::string(); 

全体のためにデストラクタを呼び出すことを余儀なくされている - これは本当にあなたが望むものを達成するための良い方法ではありません。通常の新しい\ delete演算子を使用し、再割り当てに関する内部データをコピーする方が便利です(STLベクトルでの処理方法)

+0

あなたはどのコードの部分を指していますか?あなたはmalloc経由でメモリを割り当て、新しいプレースメントを呼び出し、割り当てます。push_backで – MysticForce

+0

@ Percy123の代わりに、指定されたコードを編集できますか? – Starl1ght

関連する問題