你如何';realloc';在C++;? 我如何在C++中编写代码> ReLoCu?语言中似乎缺少它-有new和delete,但没有resize

你如何';realloc';在C++;? 我如何在C++中编写代码> ReLoCu?语言中似乎缺少它-有new和delete,但没有resize,c++,new-operator,realloc,delete-operator,C++,New Operator,Realloc,Delete Operator,我需要它,因为当我的程序读取更多数据时,我需要重新分配缓冲区来保存它。我不认为deleteing旧指针和newing新的更大的指针是正确的选择 正确的选择可能是使用一个为您完成工作的容器,如std::vector new和delete无法调整大小,因为它们只分配足够的内存来容纳给定类型的对象。给定类型的大小永远不会改变。有new[]和delete[]但几乎没有理由使用它们 不管怎样,realloc在C中所做的可能只是malloc,memcpy和free,尽管如果有足够的连续可用内存,内存管理器可

我需要它,因为当我的程序读取更多数据时,我需要重新分配缓冲区来保存它。我不认为
delete
ing旧指针和
new
ing新的更大的指针是正确的选择

正确的选择可能是使用一个为您完成工作的容器,如
std::vector

new
delete
无法调整大小,因为它们只分配足够的内存来容纳给定类型的对象。给定类型的大小永远不会改变。有
new[]
delete[]
但几乎没有理由使用它们

不管怎样,
realloc
在C中所做的可能只是
malloc
memcpy
free
,尽管如果有足够的连续可用内存,内存管理器可以做一些聪明的事情。

使用::std::vector

Type* t = (Type*)malloc(sizeof(Type)*n) 
memset(t, 0, sizeof(Type)*m)
变成

::std::vector<Type> t(n, 0);
t.resize(n2);
变成

::std::vector<Type> t(n, 0);
t.resize(n2);
若要将指针传递到函数中,而不是

Foo(t)
使用


绝对正确的C++代码,因为向量是智能C数组。C++中的“/p>< p>大小调整是很尴尬的,因为潜在需要调用构造函数和析构函数。

我不认为有一个根本原因,为什么C++中不能有<代码> Resith[]/Cux>运算符,与<代码>新[]/Cuff>和<代码> Dele[]/Cuth>,它做了类似的事情:

newbuf = new Type[newsize];
std::copy_n(oldbuf, std::min(oldsize, newsize), newbuf);
delete[] oldbuf;
return newbuf;
显然,
oldsize
将从一个秘密位置检索,这与
delete[]
中的内容相同,
Type
将来自操作数的类型<代码>调整大小[]在类型不可复制的情况下将失败-这是正确的,因为这样的对象根本无法重新定位。最后,上面的代码默认在分配对象之前构造对象,您不希望将其作为实际行为


有一种可能的优化方法,
newsize尝试类似的方法:

typedef struct Board
{
    string name;
    int size = 0;
};

typedef struct tagRDATA
{
    vector <Board> myBoards(255);

    // Board DataBoard[255];
    int SelectedBoard;

} RUNDATA;
typedef结构板
{
字符串名;
int size=0;
};
类型定义结构标记数据
{
矢量电路板(255);
//板数据板[255];
int选择板;
}运行数据;

Vector会抱怨的。这就是为什么数组、malloc和new仍然存在的原因。

下面是一个std::move示例,它使用realloc(*2)实现了一个简单的向量。如果有比我下面的副本更好的方法,请让我知道

编译为:

  g++ -std=c++2a -O2 -Wall -pedantic foo.cpp
代码:

#包括
#包括
模板类MyVector{
私人:
T*数据;
最大尺寸;
尺寸和电流;
公众:
MyVector():数据(nullptr)、maxlen(0)、currlen(0){
MyVector(int-maxlen):数据(新的T[maxlen]),maxlen(maxlen),currlen(0){
MyVector(常数MyVector&o){

STD:那么,在C++中,如何实现一个不断增长的缓冲区是正确的方法?目前我有<代码> char *Buff=(char)Maloc(size)< /C> >,当它变得太小时,我做代码> Buff= ReAlLc(size + MuleReSsize)“大小+ = MuleLySigabs<代码>。”BooCydodo:不执行增长缓冲器,只使用<代码> STD::vector < /COD> >它将在需要时自动增长,如果需要的话,可以预先分配内存(<代码> Stand()>代码>)。使用STD::vector。这是它的用途。在C++中,没有任何理由使用NeX/Dele/NeX[]/除非您明确地编写资源管理类,否则请自行删除[]。@bod:是的,可以。(顺便说一下,
std::string
)听起来像是向量。resize(先前的大小+传入的大小)
,然后将
memcpy
(或类似)插入
&向量[先前的大小]Stroustrup的回答是:“像数组一样”。很长时间以来,Cline回答说:“(这是一个好的开始,如果你是C++的新成员,还有Cline的C++ FAQ)。这个回答是由@ DrkAtLoad引用的:现在,Cline的FAQ现在是超级FAQ的一部分:不应该将MeMSET行设为MeMSET。(t,0,sizeof(t)*n);?n而不是m?@anthon是的。它应该是
Type*t=static_cast(malloc(n*sizeof*t));
使用C++11时,现在可以使用
t.data()
而不是
&t[0]
你怎么能删除这个?@a3mlord:你是什么意思?让它不在范围内,它就消失了。不,这不是为什么。我看不出这是怎么回答这个问题的。或者为什么你到处都在使用
typedef
,就好像你在写C一样。
#include <iostream>
#include <algorithm>

template<class T> class MyVector {
private:
    T *data;
    size_t maxlen;
    size_t currlen;
public:
    MyVector<T> () : data (nullptr), maxlen(0), currlen(0) { }
    MyVector<T> (int maxlen) : data (new T [maxlen]), maxlen(maxlen), currlen(0) { }

    MyVector<T> (const MyVector& o) {
        std::cout << "copy ctor called" << std::endl;
        data = new T [o.maxlen];
        maxlen = o.maxlen;
        currlen = o.currlen;
        std::copy(o.data, o.data + o.maxlen, data);
    }

    MyVector<T> (const MyVector<T>&& o) {
        std::cout << "move ctor called" << std::endl;
        data = o.data;
        maxlen = o.maxlen;
        currlen = o.currlen;
    }

    void push_back (const T& i) {
        if (currlen >= maxlen) {
            maxlen *= 2;
            auto newdata = new T [maxlen];
            std::copy(data, data + currlen, newdata);
            if (data) {
                delete[] data;
            }
            data = newdata;
        }
        data[currlen++] = i;
    }

    friend std::ostream& operator<<(std::ostream &os, const MyVector<T>& o) {
        auto s = o.data;
        auto e = o.data + o.currlen;;
        while (s < e) {
            os << "[" << *s << "]";
            s++;
        }
        return os;
    }
};

int main() {
    auto c = new MyVector<int>(1);
    c->push_back(10);
    c->push_back(11);
}