2016-10-26 1 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

어떤 코드 부분을 가리키고 있습니까? .. 대신 제공된 코드를 편집 할 수 있습니까 – MysticForce

+0

@ Percy123 push_back에서 malloc을 통해 메모리를 할당하고 new를 호출 한 다음 할당하십시오. – Starl1ght

관련 문제