"被释放的指针未被分配"在结构上

时间:2014-10-26 13:20:56

标签: c++ arrays pointers struct delete-operator

我定义了一个包含字节数组及其长度的结构。析构函数应该只删除字节数组,如果它是由结构的构造函数动态实例化的。但有时,delete array;指令失败,错误为pointer being freed was not allocated。这个数组在结构中实例化似乎很奇怪。任何人都可以帮我弄清楚什么是错的吗?

typedef unsigned char byte_t;
struct bytes_t {
    bytes_t(varint_t c) : array(new byte_t[c]), count(c), alloc(true) {}
    bytes_t(byte_t b[], varint_t c) : array(&b[0]), count(c), alloc(false) {}
    ~bytes_t() {
        if (alloc)
            delete array;
    }

    byte_t* array;
    varint_t count;
    bool alloc;
};

修改:改变了我的代码,但似乎仍然失败了。它从主线程调用时有效,但不能从另一个线程调用。

class bytes_t {
private:
    byte_t* const array_;
    const varint_t count_;
    const bool alloc_;
public:
    bytes_t(varint_t c) : array_(new byte_t[c]), count_(c), alloc_(true) {}
    bytes_t(byte_t* b, varint_t c) : array_(b), count_(c), alloc_(false) {}
    ~bytes_t() {
        if (alloc_)
            delete[] array_;
    }
    byte_t* getArray() {
        return array_;
    }
    varint_t getCount() {
        return count_;
    }
};

编辑:我关注了@ Jens'建议并使用std::vector代替。像魅力一样工作!

1 个答案:

答案 0 :(得分:2)

你班上有一些问题:

  • 使用new []分配数组时,必须调用delete []而不是delete
  • 您的类需要复制构造函数和复制赋值运算符
  • 该类只有公共成员,提供非常差的抽象,没有信息隐藏。您应该将成员设为私有,并为客户提供公共接口。

您是否考虑过使用std::vector而不是编写自己的实现?