【问题标题】:Crashing down when trying to delete objects尝试删除对象时崩溃
【发布时间】:2015-09-20 14:01:43
【问题描述】:

尝试删除我创建的对象时,我的程序崩溃了。认为删除使用关键字 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;
}

【问题讨论】:

  • 您的向量中存储了悬空指针。
  • Thought it would be save to delete objects that were created by using the keyword 'new' 是的 - 但是在这些对象被删除之后使用指向这些对象的指针是不安全的。
  • 不清楚你为什么首先使用动态分配。 Postgre&lt;User&gt; postgre;T fake_user(2, "Beverly", "Peters"); 有什么问题?

标签: c++ pointers exception


【解决方案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 复制了指针(即内存位置),因此它存储了一个已标记为已删除的内存位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 2013-05-05
    相关资源
    最近更新 更多