Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.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++_Memory_Stl_Vector - Fatal编程技术网

C++ 向量中开始和结束的内存分配

C++ 向量中开始和结束的内存分配,c++,memory,stl,vector,C++,Memory,Stl,Vector,我将向量定义为: vector< int, MyAlloc< int> > *v = new vector< int, MyAllooc< int> > (4); vector

我将向量定义为:

vector< int, MyAlloc< int> > *v = new vector< int, MyAllooc< int> > (4);
vector*v=newvector>(4);

MyAlloc只为4个整数分配空间。堆上正在为4个整数的内存分配\u存储的\u M_开始、\u完成和\u M_结束的内存。但是谁在为存储的“开始”、“结束”和“结束”分配内存呢?我想自己分配这个内存。我必须做什么?

不要使用
new
分配向量。通常,您应该从堆栈中分配向量:

vector< int, MyAlloc< int> > v(4);
vector>v(4);
如果你真的需要使用你自己的分配器,为对象分配内存,然后调用placement new来构造向量


也可以重载全局运算符new/delete,但这实在太麻烦了,我不建议这样做。

不要使用
new
来分配向量。通常,您应该从堆栈中分配向量:

vector< int, MyAlloc< int> > v(4);
vector>v(4);
如果你真的需要使用你自己的分配器,为对象分配内存,然后调用placement new来构造向量


也可以重载全局运算符new/delete,但这实在太麻烦了,我不建议这样做。

new T
在堆上分配
sizeof(T)
内存。在您的例子中,
T
std::vector
,包括
\u M\u start
等成员


如果您想自己分配内存,那么不要调用
new

newt
在堆上分配
sizeof(T)
内存。在您的例子中,
T
std::vector
,包括
\u M\u start
等成员


如果您想自己分配内存,那么不要调用
new

分配器分配容器的数据存储,而不是容器数据成员,这些数据成员按正常方式分配。必须是这种情况,否则您将无法使用new或on-the-stack创建向量。对于基于节点的容器(如列表),这一点最为明显-列表节点由分配器分配,但其他数据成员,包括指向第一个和最后一个节点的指针(如果以这种方式实现)通常分配。

分配器分配容器的数据存储,而不是容器数据成员,按正常分配。必须是这种情况,否则您将无法使用new或on-the-stack创建向量。对于基于节点的容器(如列表),这一点最为明显——列表节点由分配器分配,但其他数据成员,包括指向第一个和最后一个节点的指针(如果以这种方式实现)都是正常分配的。

创建向量时,它为向量的成员变量(即
\M
变量)分配空间无论你把向量放在哪里。如果使用
new
,它会在堆上为这些变量分配空间。对于局部变量,编译器在当前堆栈帧中为它们留出空间。如果使向量成为类的成员,编译器将在包含类中为它们留出空间


然后,向量使用其分配器为您希望存储在向量中的数据分配空间,使用分配器定义要使用的任何机制。

创建向量时,它会在放置向量的任何位置为向量的成员变量(即
\M
变量)分配空间。如果使用
new
,它会在堆上为这些变量分配空间。对于局部变量,编译器在当前堆栈帧中为它们留出空间。如果使向量成为类的成员,编译器将在包含类中为它们留出空间


然后,向量使用其分配器为您希望存储在向量中的数据分配空间,使用分配器定义使用的任何机制。

我必须在堆上分配向量。即使我使用新的布局,问题依然存在。记忆从哪里开始,从哪里结束等等;即使这样,我也只会在放置池中放置4x4=16(假设int为4字节)字节。下定决心吧!您希望自己分配内存(问题)还是使用堆内存(注释)?这两个选项确实是互相排斥的。我在这里提到的代码是在C语言程序中使用的静态C++库中。我想自己分配内存。碰巧这个内存最终是通过malloc调用来自c堆的,我必须在堆上分配向量。即使我使用新的布局,问题依然存在。记忆从哪里开始,从哪里结束等等;即使这样,我也只会在放置池中放置4x4=16(假设int为4字节)字节。下定决心吧!您希望自己分配内存(问题)还是使用堆内存(注释)?这两个选项确实是互相排斥的。我在这里提到的代码是在C语言程序中使用的静态C++库中。我想自己分配内存。碰巧这个内存最终是通过malloc调用来自c堆的。有趣的是sizeof(*v)给出12,这是存储的M_开始、M_结束和M_结束的空间。我可以从MyAlloc中的allocate函数中看出,它只分配了16个字节——刚好够INT使用,不包括_M。如果我想在堆上这样做,那么我想我必须使用new?那句话的最后一句根本没有任何意义。“Dothis”指的是什么?有趣的是sizeof(*v)给出12,这是存储的M_开始、M_结束和M_结束的空间。我可以从MyAlloc中的allocate函数中看出,它只分配了16个字节——刚好够INT使用,不包括_M。如果我想在堆上做这件事