Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;类对象向量和动态内存分配.第2部分_C++_Vector_Constructor_Erase - Fatal编程技术网

C++ C++;类对象向量和动态内存分配.第2部分

C++ C++;类对象向量和动态内存分配.第2部分,c++,vector,constructor,erase,C++,Vector,Constructor,Erase,这是我在这里发布的上一个问题()的后续内容 就本例而言,Someclass是一个过于简化的类。重要的是要知道这个类的对象存储在其他地方的向量中 Buffer是另一个类,它有三种类型的成员:正则变量(名称)、向量和指向动态分配内存块(数据)的指针 如果我注释v.erase(v.begin()+1)行,然后代码编译并运行良好。Burerase产生许多错误,例如“使用已删除函数Buffer&Buffer::operator=(const Buffer&)” 我想我理解这个问题,但不知道如何解决它。请你

这是我在这里发布的上一个问题()的后续内容

就本例而言,
Someclass
是一个过于简化的类。重要的是要知道这个类的对象存储在其他地方的向量中

Buffer
是另一个类,它有三种类型的成员:正则变量(名称)、向量和指向动态分配内存块(数据)的指针

如果我注释
v.erase(v.begin()+1)行,然后代码编译并运行良好。Bur
erase
产生许多错误,例如“使用已删除函数
Buffer&Buffer::operator=(const Buffer&)

我想我理解这个问题,但不知道如何解决它。请你修改一下我的例子,让它生效好吗?注意,这个例子过于简单,我需要保留这两个类和向量的使用

多谢各位

using namespace std;

#include <cstdlib>
#include <vector>
#include <string>

using namespace std;

class Someclass
{
public:
    int I;
    Someclass(int i) {I = i;};

private:
};

class Buffer
{
public:
    vector <Someclass> S;
    string NAME;
    float *DATA;

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

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

    }
    v.erase(v.begin()+1);
    v.clear();
    return 0;
}
使用名称空间std;
#包括
#包括
#包括
使用名称空间std;
上课
{
公众:
int I;
Someclass(inti){i=i;};
私人:
};
类缓冲区
{
公众:
向量S;
字符串名;
浮动*数据;
缓冲区(int-length,string-name){DATA=(float*)calloc(length,sizeof(float));name=name;};
缓冲区(常量缓冲区和缓冲区)=删除;
缓冲区(缓冲区和缓冲区){
S=缓冲区S;
NAME=buffer.NAME;
DATA=buffer.DATA;
buffer.DATA=nullptr;
}
~Buffer(){
S.clear();
如果(数据)免费(数据);
};
私人:
};
int main(int argc,字符**argv)
{
向量v;

对于(int i=0;i这是因为一个简单的原因。当您擦除一个条目时,数组需要删除该“气泡”(即空槽)并压缩数组。这意味着它需要移动一些内容。因此,当移动时,它们所做的是这样的

//形成MSVC xutility.h文件。
对于(;_First!=_Last;++_Dest,(void)++_First){
*_目的地=_标准移动(*_优先);
}
如您所见,它们移动它的方式是通过移动单个条目。这意味着您调用对象
缓冲区的复制赋值/移动赋值运算符。但是您没有定义任何赋值运算符,而是定义了移动构造函数。这告诉编译器

嘿,这个缓冲区对象只有一个移动构造函数。可能用户只是想通过移动另一个来构造类。所以它不能有任何其他赋值(复制和移动)

因此,现在编译器不会为您生成它们。这意味着您现在无法将另一个
缓冲区复制或移动到另一个
缓冲区(除非您移动它)。这就是错误的原因

解决方案是添加移动分配操作符

Buffer&operator=(Buffer&other)
{
S=标准::移动(其他.S);
NAME=std::move(其他.NAME);
数据=其他数据;
other.DATA=nullptr;//确保将其设置为nullptr。
归还*这个;
}

解决方案大概是定义一个移动赋值运算符。在这种情况下,当类具有复杂的成员类型(向量、动态内存等)时,您能说明如何执行此操作吗@SVS我添加了解决方案。谢谢你,我感谢你的时间和努力。你认为我应该为
S=std::move(other.S);
替换move构造函数中的
S=buffer.S;
?如果我有一个简单的成员说
int I
我会使用
I=other.I
还是
I=std::move(other.I)
在两个构造函数中。@D-RAJ谢谢你为什么不为
数据本身使用
std::vector
std::array
,并且完全不用担心内存管理?因为这是一个简化的示例,在实际情况下,类有许多成员,但是,向量成员是问题的根源。注意,这个例子过于简单,我需要保留这两个类和向量的使用。"使用
std::vector
的具体问题是什么?您知道,您可以安全地将指向连续分配的
T
数组的指针与任何其他需要原始指针的API交换?这可以通过使用来完成,并且将适用于任何额外的复杂性。我不理解您的顾虑,这是真实的完全没有必要自己(重新)实现所有这些东西来进行适当的内存管理。也许你应该问(另一个)关于你所面临的
std::vector
问题的问题。