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

时间:2011-06-22 01:49:32

标签: c++ pointers vector segmentation-fault

我在以下代码中遇到了分段错误。你能帮我解决一下吗?在下面的代码中,它打印“ok here”。一旦解除分配内存,就会显示分段错误。但为什么 ?任何解决方案?

对此有任何帮助将不胜感激。

#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;    
}

4 个答案:

答案 0 :(得分:4)

您没有关注the rule of threeCube没有实现正确的复制赋值运算符。正如其他人所提到的那样,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);
}

确保您拥有a good introductory C++ book

答案 1 :(得分:1)

你在这里delete Cube数组:

delete [] c;

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

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

应该只是:

delete c;

答案 2 :(得分:0)

delete [] c;

应该是

delete c;

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

答案 3 :(得分:0)

您使用了

delete [] c;

如果c分配如下:

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

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