当我在 C++ 中推回矢量类上的元素时出现分段错误
segment fault when i push back element on vector class in c++
#include <iostream>
#include<vector>
#include <algorithm>
using namespace std;
class HasPtr {
private:
int *count;
string *str_ptr;
public:
string getStrPtr(){
return *str_ptr;
}
HasPtr(const string &str = string()) : count(new int(1)), str_ptr(new string(str)) {
cout << str << endl;
}
HasPtr(const HasPtr &hasPtr) {
count = hasPtr.count;
str_ptr = hasPtr.str_ptr;
*count = (*count) + 1;
}
HasPtr &operator=(const HasPtr &hasPtr) {
if (this == &hasPtr) return *this;
if (--*count) {
delete str_ptr;
delete count;
}
count = hasPtr.count;
str_ptr = hasPtr.str_ptr;
(*count)++;
}
bool operator<(const HasPtr &hasPtr) {
return this->str_ptr < hasPtr.str_ptr;
}
~HasPtr() {
if (--*count) {
delete str_ptr;
delete count;
}
}
friend void swap(HasPtr &ptr1, HasPtr &ptr2);
};
inline void swap(HasPtr &ptr1, HasPtr &ptr2) {
using std::swap;
swap(ptr1.count, ptr2.count);
swap(ptr1.str_ptr, ptr2.str_ptr);
cout << "swap" << endl;
}
int main() {
vector<HasPtr> vecArr;
HasPtr hp1(string("a"));
HasPtr hp2(string("d"));
HasPtr hp3(string("c"));
HasPtr hp4(string("b"));
vecArr.push_back(hp1);
vecArr.push_back(hp2);
vecArr.push_back(hp3);
vecArr.push_back(hp4);
for(int i = 0; i < 4 ; i++)
for(int j = 0; j<4-i-j;j++){
if(vecArr[j] < vecArr[j+1]){
swap(vecArr[j],vecArr[j+1]);
}
}
for(auto e : vecArr){
cout<< e.getStrPtr() <<endl;
}
return 0;
}
代码粘贴在上面。在代码中,我定义了一个类和相应的复制操作、赋值操作等。
当程序执行以下语句时
vecArr.push_back(hp3);
我的机器发生了段故障。我是C++的新手。这个问题让我困惑了几个小时。我不知道为什么。请帮助我。提前谢谢。
您的取消链接逻辑已损坏:
if (--*count) {
delete str_ptr;
delete count;
}
如果--*count
为真,即不等于 0,则删除。所以适当的条件应该是:
if (not --*count) {
delete str_ptr;
delete count;
}
此外,您不应复制该代码,而应将其移动到方法并从 DTOR 和赋值运算符调用。
我看到两个问题。 首先是围绕释放的守卫被否定。 如前所述,这将在每次发生副本时释放共享空间。 将if (--*count)
行更改为if (--*count == 0)
以解决此问题。
二是赋值运算符不return *this
。 使用返回值时,链式赋值操作(例如,a = b = c
(将无法按预期工作。
相关文章:
- 从矢量中删除元素后出现隔离错误
- 删除映射和分割错误中的一个过去结束元素
- 在 alglib::real_1d_array 中获取元素总和的奇怪错误
- C++ - 将元素按升序插入数组的 SEG 错误
- 使用 <list> (错误 C2760) 打印队列的元素
- C++:使用类在向量中搜索特定元素时,我得到了错误的结果
- 用于查找数组中最大元素的出现次数的代码,给出分段错误
- C++ 将元素分配给映射值时访问错误
- 从加密项目向量中解密任意选择的元素会导致无效的 PKCS #7 块错误
- C++通过别名指针以静默方式将错误的类型分配给数组元素
- Leetcode 540 上的运行时错误.排序数组中的单个元素
- std::我不明白的矢量元素错误
- 如何修复从矢量中删除元素的错误?
- 为什么我在对向量的第二个元素"push_back"中有C3867错误
- 尝试访问 3D 矢量中的元素时出现 Seg 错误
- OpenCV 文件存储 - 错误:元素之间的解析错误 (icvYMLParseValue) 缺失
- 访问range_expression中的嵌套元素会返回不完整的映射(段错误)
- 打印向量元素错误消息
- 数组中的cout元素错误,错误
- 迭代并移除Vector中的元素.错误:Vector迭代器不可递增