当我在 C++ 中推回矢量类上的元素时出现分段错误

segment fault when i push back element on vector class in c++

本文关键字:元素 错误 分段 C++      更新时间:2023-10-16
#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(将无法按预期工作。