2015-09-20 8 views
-1

Моя программа сбрасывается при попытке удалить созданные объекты. Думал, что было бы безопасно удалить объекты, созданные с помощью ключевого слова new.Сбой при попытке удалить объекты

Почему это происходит?

Вот код:

Заголовок

#include <iostream> 
#include <vector> 
#include<string> 

template<typename T> 
class Postgre { 
public: 
    Postgre(); 

    std::vector<T*> get_user(); 
    std::vector<T*> get_fake_user(); 

    ~Postgre(); 
}; 

class User { 
public: 
    User(short id, std::string first_name, std::string last_name) { 
     this->ID = id; 
     this->first_name = first_name; 
     this->last_name = last_name; 
    } 

    short ID; 
    std::string first_name; 
    std::string last_name; 
}; 

class Fake_User { 
public: 
    Fake_User(short id, std::string user_name, std::string user_pw) { 
     this->ID = id; 
     this->user_name = user_name; 
     this->user_pw = user_pw; 
    } 

    short ID; 
    std::string user_name; 
    std::string user_pw; 
}; 

источник

template<typename T> 
Postgre<T>::Postgre() { 

} 

template<typename T> 
Postgre<T>::~Postgre() { 
} 

template<typename T> 
std::vector<T*> Postgre<T>::get_user() { 
    T* user = new T(1, "Peter", "Peters"); 
    std::vector<T*> result; 

    result.push_back(user); 
    delete user; 
    return result; 
} 

template<typename T> 
std::vector<T*> Postgre<T>::get_fake_user() { 
    T* fake_user = new T(2, "Beverly", "Peters"); 
    std::vector<T*> result; 

    result.push_back(fake_user); 
    delete fake_user; 
    return result; 
} 

template class Postgre<User>; 
template class Postgre<Fake_User>; 

главный

int _tmain(int argc, _TCHAR* argv[]){ 
    Postgre<User>* postgre = new Postgre<User>(); 

    //test User Class: 
    std::vector<std::vector<User*>> list_user; 
    list_user.push_back(postgre->get_user()); 

    std::cout << list_user[0][0]->ID << std::endl; 
    std::cout << list_user[0][0]->first_name << std::endl; 
    std::cout << list_user[0][0]->last_name << std::endl; 

    std::cout << std::endl; 
    //test Fake_User Class: 
    Postgre<Fake_User>* postgre2 = new Postgre<Fake_User>(); 

    std::vector<std::vector<Fake_User*>> list_fake_user; 
    list_fake_user.push_back(postgre2->get_fake_user()); 

    std::cout << list_fake_user[0][0]->ID << std::endl; 
    std::cout << list_fake_user[0][0]->user_name << std::endl; 
    std::cout << list_fake_user[0][0]->user_pw << std::endl; 

    //wait for keypress 
    std::cin.ignore(); 

    return 0; 
} 
+0

У вас есть оборванные указатели, хранящиеся в вашем векторе. –

+1

'Думал, что это будет сохранить, чтобы удалить объекты, созданные с помощью ключевого слова 'new' 'Yes - но небезопасно использовать указатели на эти объекты ** после **, они были удалены таким образом. –

+0

Непонятно, почему вы используете динамическое распределение в первую очередь. Что случилось с 'Postgre postgre;' или 'T fake_user (2,« Беверли »,« Питерс »);'? –

ответ

1

В

template<typename T> 
std::vector<T*> Postgre<T>::get_user() { 
    T* user = new T(1, "Peter", "Peters"); 
    std::vector<T*> result; 

    result.push_back(user); // you copy the pointer into result 
    delete user; // you delete the pointer, now user is dangling 
    return result; // on exit, the pointer user in vector result is dangling 
} 

вы возвращаете вектор, который хранит указатели, которые были удалены (висячие). Обратите внимание, что push_back копирует указатель (т. Е. Место памяти), поэтому он сохраняет ячейку памяти, которая уже помечена как удаленная.

Смежные вопросы