2011-06-22 68 views
0

我在下面的代码中遇到了分段错误。你能帮我弄清楚吗?在下面的代码中,它打印出“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;  
} 
+0

如果您使用'new []''您必须使用'delete []' –

+0

您是否尝试过使用gdb来查找失败的行?看起来像问题是你删除[] - 当它是一个char *的str变量。 – Suroot

回答

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

+0

非常感谢你!它确实有帮助。 – Miraj

0
delete [] c; 

应该

delete c; 

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

1

您是delete荷兰国际集团的Cube数组在这儿:

delete [] c;

但是你没有分配这里的数组:

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

这应该只是:

delete c;

+0

非常感谢! ! – Miraj

0

您使用

delete [] c; 

如果c的分配是这样的:

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

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