我在以下代码中遇到了分段错误。你能帮我解决一下吗?在下面的代码中,它打印“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 :(得分:4)
您没有关注the rule of three: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);
}
答案 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是合适的。在这种情况下,您应该省略[]。