什么是复杂对象的“最小框架”(必要的方法)(带有明确的内部数据),我想存储在STL容器中,例如 <vector>?

对于我的假设(复杂对象doit的示例):

#include <vector>
#include <cstring>
using namespace std;
class Doit {
    private:
        char *a;
    public:
        Doit(){a=(char*)malloc(10);}
        ~Doit(){free(a);}
};

int main(){
    vector<Doit> v(10);
}

给予

*** glibc detected *** ./a.out: double free or corruption (fasttop): 0x0804b008 ***
Aborted

并在Valgrind中:

malloc/free: 2 allocs, 12 frees, 50 bytes allocated.

更新:

这种对象的最小方法为:(基于SBI答案)

class DoIt{
    private:
        char *a;
    public:
        DoIt() { a=new char[10]; }
        ~DoIt() { delete[] a; }
        DoIt(const DoIt& rhs) { a=new char[10]; std::copy(rhs.a,rhs.a+10,a); }
        DoIt& operator=(const DoIt& rhs) { DoIt tmp(rhs); swap(tmp); return *this;}
        void swap(DoIt& rhs) { std::swap(a,rhs.a); }
};

谢谢,SBI, https://stackoverflow.com/users/140719/SBI

有帮助吗?

解决方案

请注意,查尔斯有 回答了你的问题 完美。

无论如何,根据 三个规则, ,您的班级具有攻击函数,也应该有一个复制构造函数和一个作业操作员。

这就是我的方式:

class Doit {
    private:
        char *a;
    public:
        Doit()                   : a(new char[10]) {}
        ~Doit()                    {delete[] a;}
        DoIt(const DoIt& rhs)    : a(new char[10]) {std::copy(rhs.a,rhs.a+10,a);}
        void swap(DoIt& rhs)       {std::swap(a,rhs.a);}
        DoIt& operator=(DoIt rhs)  {swap(rhs); return *this;}
};

其他提示

您使用的所有类型都必须是 CopyConstructibleAssignable.

CopyConstructible 对于类型 T 意味着如果 t 是一个 T 或a const T 然后表达式 T(t) 必须产生等效的 T 到原始 t; t。〜t()必须是有效的(可访问的破坏者);和 &t 必须给予地址 t 作为一个 [const] T*.

Assignable 意味着对于 T, tT 价值 u, , 表达方式 t = u 必须做 t 相当于 u 并且是类型 T&.

请注意,所有这些要求都是通过简单的内置类型和POD结构来满足的。如果您在破坏者或构造函数中执行任何不平凡的事情,则必须确保复制构造函数和复制分配运算符保存器为等效语义。

全部 vector 要求该对象是“可分配”的,这意味着它需要复制构造者,驱动器和作业运算符,如果您自己不提供它们,则默认情况下所有这些都是生成的。

正如SBI所说,如果您需要其中一个功能,那么您可能需要所有功能。就您而言,您还需要提供复制构造函数和分配操作员,以避免堆积损坏。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top