如何实现析构函数
How to implement a destructor
我无法理解向量和堆。到目前为止,我想创建一个 int 向量。这个向量的元素应该存储在堆中。我实现了 class,但我认为我没有正确实现析构函数。移动构造函数也有问题。如果我想将向量 a 移动到向量 b,a 保持相同的值。
Class A {
private :
vector<int> myV ;
int val;
size_t Size;
public:
A(){
myV.resize(0);
this->value = 0 ;
}
A(size_t size){
MyVector.resize(0);
Size = size ;
this->value = 0 ;
}
A(size_t size, int value){
A.resize(0);
Size = size;
Val = value;
MyVector.push_back(Val);
}
~A()
{
myV.clear();
delete &myV;
}
A(A&&other)
{
*this = std::move(other);
this->myV = other.myV ;
}
我试图检查代码,但是
int main()
{
Vector myVect(2,5);
Vector m (std::move(myVect));
std::cout<<m[0]<<std::endl;
}
myVect 的值没有移动,尽管它保持原样。
根据我的理解,vector 应该在堆上分配元素,我如何在没有内存泄漏的情况下释放它。
请在下面找到一个工作示例。
#include <vector>
#include <iostream> // Debug only
class Vector
{
private:
std::vector<int> _myVec;
int _val;
size_t _size;
public:
// "Regular" Construtors
Vector() : _val(0), _size(0) {}
Vector(size_t size) : _size(size), _val(0) {}
Vector(size_t size, int value) : _val(value), _size(size)
{
_myVec.push_back(_val);
}
// Move Constructor
Vector(Vector&& other)
{
std::cout << "Move Constructor called\n"; // Debug purpose
_myVec = std::move(other._myVec);
_val = std::move(other._val);
_size = std::move(other._size);
}
// Destructor
~Vector()
{
_myVec.clear(); // useless being given the destructor will destroy the vector of int anyway
}
// Getter
std::vector<int> getMyVec() const { return _myVec; }
};
int main()
{
std::cout << "Hello world\n";
Vector _myVecect(2, 5);
Vector m(std::move(_myVecect));
std::cout << m.getMyVec()[0] << std::endl;
return 0;
}
创建移动构造函数时,必须移动 class 的每个成员,就像上面 ^ 所做的那样。
对于您的 main 中的 cout 行,这不能正常工作,因为您的变量 'm' 是 class Vector 的一个实例。你不能通过 [] 运算符来操作它,除非你自己定义它来像处理数组一样使用它。
如果您不管理流或动态内存,则不需要这种析构函数。如果你有一个流,析构函数将是一个关闭的好地方,以确保没有人会在对象删除后尝试使用该流。
在动态内存的情况下,你不必在这里使用 delete 因为我们现在有现代 C++ 智能指针(unique_ptr 和 smart_ptr 可以为你完成这项工作)。
你应该阅读 0 的规则(例如 here,它从 3/5 规则开始,一定要读到最后)。
std::vector
已经为您管理内存。当移动构造函数只做编译器生成的可以做的事情时,您也不应该实现它。此外,您应该使用成员初始值设定项列表来初始化成员。尽管默认构造的 std::vector
的大小已经为 0,但无需调整它的大小。而且你忘了在默认构造函数中初始化 Size
,它也没有在移动构造函数中移动。我想 Size
应该是矢量的大小,但矢量已经跟踪它的大小,所以我删除了那个成员。我进一步假设 val
是您要存储在向量中的某个值,因此无需将其复制为成员。
您的 class 可能如下所示:
class A {
std::vector<int> myV ;
public:
A() = default;
A(size_t size) : myV(size) {}
A(size_t size, int value) : myV(size,value) {}
std::vector<int> get() { return myV; }
};
我无法理解向量和堆。到目前为止,我想创建一个 int 向量。这个向量的元素应该存储在堆中。我实现了 class,但我认为我没有正确实现析构函数。移动构造函数也有问题。如果我想将向量 a 移动到向量 b,a 保持相同的值。
Class A {
private :
vector<int> myV ;
int val;
size_t Size;
public:
A(){
myV.resize(0);
this->value = 0 ;
}
A(size_t size){
MyVector.resize(0);
Size = size ;
this->value = 0 ;
}
A(size_t size, int value){
A.resize(0);
Size = size;
Val = value;
MyVector.push_back(Val);
}
~A()
{
myV.clear();
delete &myV;
}
A(A&&other)
{
*this = std::move(other);
this->myV = other.myV ;
}
我试图检查代码,但是
int main()
{
Vector myVect(2,5);
Vector m (std::move(myVect));
std::cout<<m[0]<<std::endl;
}
myVect 的值没有移动,尽管它保持原样。
根据我的理解,vector 应该在堆上分配元素,我如何在没有内存泄漏的情况下释放它。
请在下面找到一个工作示例。
#include <vector>
#include <iostream> // Debug only
class Vector
{
private:
std::vector<int> _myVec;
int _val;
size_t _size;
public:
// "Regular" Construtors
Vector() : _val(0), _size(0) {}
Vector(size_t size) : _size(size), _val(0) {}
Vector(size_t size, int value) : _val(value), _size(size)
{
_myVec.push_back(_val);
}
// Move Constructor
Vector(Vector&& other)
{
std::cout << "Move Constructor called\n"; // Debug purpose
_myVec = std::move(other._myVec);
_val = std::move(other._val);
_size = std::move(other._size);
}
// Destructor
~Vector()
{
_myVec.clear(); // useless being given the destructor will destroy the vector of int anyway
}
// Getter
std::vector<int> getMyVec() const { return _myVec; }
};
int main()
{
std::cout << "Hello world\n";
Vector _myVecect(2, 5);
Vector m(std::move(_myVecect));
std::cout << m.getMyVec()[0] << std::endl;
return 0;
}
创建移动构造函数时,必须移动 class 的每个成员,就像上面 ^ 所做的那样。 对于您的 main 中的 cout 行,这不能正常工作,因为您的变量 'm' 是 class Vector 的一个实例。你不能通过 [] 运算符来操作它,除非你自己定义它来像处理数组一样使用它。
如果您不管理流或动态内存,则不需要这种析构函数。如果你有一个流,析构函数将是一个关闭的好地方,以确保没有人会在对象删除后尝试使用该流。 在动态内存的情况下,你不必在这里使用 delete 因为我们现在有现代 C++ 智能指针(unique_ptr 和 smart_ptr 可以为你完成这项工作)。
你应该阅读 0 的规则(例如 here,它从 3/5 规则开始,一定要读到最后)。
std::vector
已经为您管理内存。当移动构造函数只做编译器生成的可以做的事情时,您也不应该实现它。此外,您应该使用成员初始值设定项列表来初始化成员。尽管默认构造的 std::vector
的大小已经为 0,但无需调整它的大小。而且你忘了在默认构造函数中初始化 Size
,它也没有在移动构造函数中移动。我想 Size
应该是矢量的大小,但矢量已经跟踪它的大小,所以我删除了那个成员。我进一步假设 val
是您要存储在向量中的某个值,因此无需将其复制为成员。
您的 class 可能如下所示:
class A {
std::vector<int> myV ;
public:
A() = default;
A(size_t size) : myV(size) {}
A(size_t size, int value) : myV(size,value) {}
std::vector<int> get() { return myV; }
};