类对象的C ++向量和动态内存分配

SVS

这是我想要做的简化版本,它在调用push_back时会崩溃,特别是在调用析构函数时。如果删除析构函数的主体,则它可以工作,但我想确保将其删除。代替calloc / free,我尝试了new / delete,结果相同。我在这里做什么错?

#include <cstdlib>
#include <vector>


using namespace std;

class Buffer
{
public:
    float *DATA;

    Buffer(int length) {DATA = (float*) calloc (length,sizeof(float));};
    virtual ~Buffer(){free (DATA);};
    
private:
};

int main(int argc, char** argv)
{
    vector <Buffer> v;
    for (int i =0; i<10; i++)
        v.push_back(Buffer(1000));
    
    return 0;
}

智者

这是一个工作代码:https : //godbolt.org/z/ex9oMG

#include <cstdlib>
#include <vector>

using namespace std;

class Buffer
{
public:
    float *DATA;

    Buffer(int length) {DATA = (float*) calloc (length,sizeof(float));};
    Buffer(const Buffer &buffer) = delete;
    Buffer(Buffer&& buffer) { 
        DATA = buffer.DATA;
        buffer.DATA = nullptr;
    }
    ~Buffer(){
        if (DATA) free(DATA);
    };
    
private:
};

int main(int argc, char** argv)
{
    vector <Buffer> v;
    for (int i =0; i<10; i++)
        v.push_back(Buffer(1000));
    return 0;
}

您需要在此处定义一个移动构造函数,主要是因为v.push_back(Buffer(1000))需要一个移动操作,否则删除原始副本将释放资源。

我已明确删除了复制ctor,因为在处理此类资源时-不应允许复制。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章