指向矢量的指针:获取分段错误
pointer to a vector: getting segmentation fault
我在下面的代码中得到了分段错误。你能帮我弄清楚吗?在下面的代码中,它会在此处打印"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将是合适的。在这种情况下,您应该省略[]。
相关文章:
- 获取未知分段错误"(地址)在 std::__cxx11::basic_string<char, std::char_traits<char>,..., std::分配器<cha
- C++ .我正在尝试通过使用开关内的数组来获取用户输入,但是当我运行代码时,它显示分段错误?
- 在编写代码以查找数组中的对数时获取分段错误
- 获取分段错误(代码在 c++ 中转储
- 获取分段错误,用于在 protobuffer 的 C++ 中实现 ByteSize()
- 尝试从另一个类对象获取值时出现分段错误
- 在 GMock API GetValueAndDelete() 中获取分段错误
- 使用 getline 函数获取分段错误
- 读取文件夹中的文件列表时获取分段折叠
- 制作链表:获取分段错误
- 在C++中生成一组整数的排列.获取分段错误
- 将中缀转换为后缀并获取分段错误核心转储错误
- 在终端中获取分段故障11错误
- 使用TinyXML获取分段错误
- 在 QFile::set文件名上获取分段错误
- 斯特托克获取分段错误读取文件
- 使用pthreads在c++中获取分段错误
- c++使用std::set并获取分段故障D:
- 获取"分段错误:尝试将字符串写入 setter 时核心转储
- 指向矢量的指针:获取分段错误