C++ 动态内存调整字符数组大小

C++ 动态内存调整字符数组大小,c++,c++14,dynamic-memory-allocation,C++,C++14,Dynamic Memory Allocation,我正在尝试调整字符数组的大小,我遵循了以下步骤: 然后: 我做过这样的事情: // this crashes in runtime: const long SIZE_X = 1048576; char* Buffsz = new char(sizeof(char)); for(int i = 0; i < (SIZE_X - 2); i++) { Buffsz[i] = 'a'; if(realloc(Buffsz, sizeof(char) * i) == NUL

我正在尝试调整字符数组的大小,我遵循了以下步骤:

然后:

我做过这样的事情:

// this crashes in runtime:

const long SIZE_X = 1048576;

char* Buffsz = new char(sizeof(char));

for(int i = 0; i < (SIZE_X - 2); i++)
{
    Buffsz[i] = 'a';
    if(realloc(Buffsz, sizeof(char) * i) == NULL) // autoallocate memory
        cout << "Failled to reallocate memory!" << endl;
}
//这会在运行时崩溃:
const long SIZE_X=1048576;
char*Buffsz=新字符(sizeof(char));
对于(int i=0;i<(大小X-2);i++)
{
Buffsz[i]=“a”;
if(realloc(Buffsz,sizeof(char)*i)=NULL)//自动分配内存
CUT< P> <代码> RealCube()/Cyr>用于调整分配给C代码的数组,该数组是用“代码> MARROCK())/>代码> <代码> RealCube()>代码>不能用于C++代码,在动态范围内用C++代码调整大小的C++对象。
在C++中,C++中最简单的方法是:在一个动态范围内构造一个新的数组,该代码的范围是<代码>新[]/Cord>,现有数组的值<代码> STD::拷贝< /COD> -ED到新数组,然后旧数组<代码>删除[]/COD>-ED.<
这需要大量的工作。这将涉及大量不必要的默认构造和复制赋值(如果您的类没有默认构造函数,那么您将陷入困境)。使用placement new和manual copy/move构造函数可以优化其中的一些工作。但这是一项艰巨的工作。这就是为什么您应该使用
std::vector
。它可以为您完成所有这些工作,并且可以正确地完成这些工作

如您所愿,您自己使用
new
delete
并没有什么错。这是一次很好的学习经验,可以帮助您了解如何正确管理动态范围对象。充分了解低级动态范围界定的工作原理是非常有价值的知识。但是,在某些情况下这会变得非常陈旧,涉及动态范围对象的非琐碎任务会变得单调乏味、容易出错,并且会消耗大量时间


在这一点上,保持心智健全的唯一方法是使用C++库容器,它负责处理所有的繁琐工作。总之:使用<代码> STD::向量< /代码>,让它为您做所有这些工作。< /P> < P>使用<代码> ReLoC/<代码>内存必须分配为<代码> Malc C <代码>或其他FUNC。在那个家庭里,我有一个孩子


<> > C++中处理<代码> char 字符串的最简单方法是使用<代码> STD::String

< P>在指针分配内存中不能使用<代码> RealCube()/代码>代码< < < <代码> >运算符。可以使用此函数调整指针

char* Resize(char*& old,long int length,long int resize_to)
{
    char* new_ptr;
    new_ptr = new char[ resize_to ];
    long int least = ( length < resize_to ) ? length : resize_to;
    for(long int i = 0;i < least ; ++i)
        new_ptr [i] = old[i];
    delete [] old;
    old = nullptr;
    return new_ptr;
}
char*调整大小(char*&旧、长整型长度、长整型调整大小\u到)
{
字符*新的ptr;
new_ptr=新字符[将_大小调整为];
long int least=(长度
这可能会起作用,不要忘记在不再需要指针后删除[]
,否则您将不得不担心内存泄漏


虽然您可能希望使用
std::string
std::vector
或创建自己的动态扩展堆栈类。

realloc分配一个新块。但是在您的代码中,Buffsz始终指向刚释放的旧块。此外,您的代码分配一个字符,写入第一个元素,将其重新分配为零个字符,写入s到第二个元素(不存在),重新分配到一个字符,写入第三个元素(不存在),…我不知道,我认为这是可能的,我别无选择,只能使用
std::vector
。非常感谢。
char* Resize(char*& old,long int length,long int resize_to)
{
    char* new_ptr;
    new_ptr = new char[ resize_to ];
    long int least = ( length < resize_to ) ? length : resize_to;
    for(long int i = 0;i < least ; ++i)
        new_ptr [i] = old[i];
    delete [] old;
    old = nullptr;
    return new_ptr;
}