C++无效指针错误

use*_*088 2 c++ pointers

我从下面的代码中得到无效点错误我不明白为什么.我要做的就是从向量中删除堆上的一些字符串:

void func() {
    vector<string>* vec = new vector<string>;
    vec->push_back(*(new string("1")));
    vec->push_back(*(new string("2")));

    for(vector<string>::iterator itr = vec->begin(); itr != vec->end(); ++itr)
    {
        string* ptr = &(*itr);
        delete(ptr);
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:是因为push_back创建了字符串的副本?

Who*_*aig 6

您的错误是因为元素未动态分配; 该矢量是.你要做的是需要:

void func() 
{
    vector<string*> vec;
    vec.push_back(new string("1"));
    vec.push_back(new string("2"));

    for(vector<string*>::iterator itr = vec.begin(); itr != vec.end(); ++itr)
    {
        string* ptr = *itr;
        delete(ptr);
    }
}
Run Code Online (Sandbox Code Playgroud)

但老实说,我认为没有理由这样做.在编写代码时,您的代码不仅会尝试删除它从未实际分配的内存,而且会泄漏它所做的分配.

原因存储对象的指针在矢量这样的(如对象从另一个容器别的地方其实是和你需要他们的自定义排序操作的临时列表而不破坏原来的内容),但直觉告诉我你有这样一个需要的方式.

  • 你*可以*使用指针向量.但你可能没有理由. (2认同)
  • @ user1861088,这是一个与访问存储在容器中的元素不同的问题.一般来说,如果你每个人都想使用指针,你真的需要理解C++所有权语义.如果需要从函数返回对象,请按值返回.C++ 11具有移动语义,通常可以确保移动对象而不是复制对象.否则,如果您不使用C++ 11,则考虑使用"输出值参数"返回智能指针或(不太优选). (2认同)