class 个对象的 C++ 向量和动态内存分配
C++ vector of class objects and dynamic memory allocation
这是我想要做的事情的简化版本,它在调用 push_back 时崩溃,特别是在调用析构函数时。如果我删除析构函数的主体,它会起作用,但我想确保它已被删除。我尝试 new/delete 而不是 calloc/free,结果相同。我在这里做错了什么?
#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))
需要一个移动操作,否则删除原始副本将释放资源。
我已经明确删除了复制构造函数,因为在处理此类资源时 - 不应允许复制。
这是我想要做的事情的简化版本,它在调用 push_back 时崩溃,特别是在调用析构函数时。如果我删除析构函数的主体,它会起作用,但我想确保它已被删除。我尝试 new/delete 而不是 calloc/free,结果相同。我在这里做错了什么?
#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))
需要一个移动操作,否则删除原始副本将释放资源。
我已经明确删除了复制构造函数,因为在处理此类资源时 - 不应允许复制。