指向矢量的指针:获取分段错误

pointer to a vector: getting segmentation fault

本文关键字:获取 分段 错误 指针      更新时间:2023-10-16

我在下面的代码中得到了分段错误。你能帮我弄清楚吗?在下面的代码中,它会在此处打印"ok"。一旦它释放内存,就会显示分段错误。但为什么呢?有什么解决方案吗?

如有任何帮助,我们将不胜感激。

#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
class Cube
{
public:
    char *str;
    Cube(int len)
    {
        str = new char[len+1];
    }
    Cube(const Cube &c)
    {
        str = new char[strlen(c.str) + 1];
        strcpy(str, c.str);
    }   
    ~Cube()
    {
        delete [] str;
    }
};
void foo(vector <Cube> *vec)
{
    for (int i = 0; i < 10; i++)
    {
        char in [] = "hello !!";
        Cube *c = new Cube(strlen(in)+1);
        strcpy(c->str, in);
        vec->push_back(*c);
        cout << "ok here" << endl;
        delete [] c;
    }
}
int main()
{
    vector <Cube> vec;
    foo(&vec);  
    return 0;    
}

您没有遵守三条规则:Cube没有实现正确的复制赋值运算符。正如其他人所提到的,你也将new[]delete不匹配,这只能以眼泪告终。

也就是说,您不需要使用指针或显式动态分配来实现这一切。您应该将new char[]的使用替换为std::string,并且不要在堆上分配任何Cube对象。在一个编写良好的C++程序中,new应该很少使用,而delete几乎不需要使用。

这个程序没有显式的动态分配,具有与您期望的程序相同的结果,但是正确的。注意,当你不担心自己动态分配或显式销毁东西时,代码是多么干净!

#include <string>
#include <vector>
struct Cube {
    std::string str;
    explicit Cube(std::string const& s) : str(s) { }
};
void foo(std::vector<Cube>& vec) {
    for (int i = 0; i < 10; ++i) {
        vec.push_back(Cube("hello !!"));
    }
}
int main() {
    std::vector<Cube> vec;
    foo(vec);
}

确保你有一本很好的C++入门书。

您在delete中使用Cube的数组:

delete [] c;

但你没有在这里分配数组:

Cube *c = new Cube(strlen(in)+1);

应该只是:

delete c;

delete [] c;

应该是

delete c;

除此之外,Cube类本身也是可疑的。最好使用std::string,而不是c样式的字符串。

您使用了

delete [] c;

如果c是这样分配的:

Cube * c = new Cube[3]; //3 for example

然后删除[]c将是合适的。在这种情况下,您应该省略[]。