C++ 使用“后添加新对象”;新";

C++ 使用“后添加新对象”;新";,c++,pointers,object,new-operator,C++,Pointers,Object,New Operator,调用new之后,如何向指针添加更多对象?(我上课需要它) 这就是我的意思: int *a; a = new int; a = new int; 多谢各位 在C语言中,可以使用realloc。在C++中,您将使用STL的代码>代码::vector < /COD>而不是指针。你可以做一些丑陋的事情,比如: int *a; a = new int[1]; delete [] a; a = new int[2]; 但是您会遇到性能下降。在C中,您将使用realloc。在C++中,您将使用STL的代码

调用new之后,如何向指针添加更多对象?(我上课需要它) 这就是我的意思:

int *a;
a = new int;
a = new int;

多谢各位

在C语言中,可以使用
realloc
。在C++中,您将使用STL的代码>代码::vector < /COD>而不是指针。你可以做一些丑陋的事情,比如:

int *a;
a = new int[1];
delete [] a;
a = new int[2];

但是您会遇到性能下降。

在C中,您将使用
realloc
。在C++中,您将使用STL的代码>代码::vector < /COD>而不是指针。你可以做一些丑陋的事情,比如:

int *a;
a = new int[1];
delete [] a;
a = new int[2];

但是性能会下降。

您可能应该使用or。

如果需要连续缓冲区使用向量,您可能应该使用or。

std::vector<int> buf;
buf.push_back( 1 );
buf.push_back( 2 );
buf.push_back( 3 );

int * intbuf = &buf[0];
或者其他号码。您仍然可以向向量添加65536个以上的项,但可以保证,只要大小小于此值,&buf[0]就不会更改

考虑到您没有执行任何操作,您正在尝试实现vector,一种方法是根本不使用new,而是使用malloc来分配内存,因此:

char * buf = static_cast<char *>( malloc( BUF_SIZE ) );
当您需要更多空间时,您可以“realloc”指针。一定要先重新锁定到一个临时的,以检查它是否成功

bufNew = static_cast< char * >( realloc( buf, newBufSize ) );
if( bufNew )
     buf = bufNew;
bufNew=static_cast(realloc(buf,newBufSize));
如果(bufNew)
buf=bufNew;
这在这里起作用,因为int是POD类型。如果类型不是POD,则realloc和简单地通过内存移动对象是不安全的,您需要将它们作为对象移动,在每个对象上使用operator=


现在您已经知道了一点,但出于实际目的,您可能希望使用vector。

如果需要连续缓冲区,请使用vector

std::vector<int> buf;
buf.push_back( 1 );
buf.push_back( 2 );
buf.push_back( 3 );

int * intbuf = &buf[0];
或者其他号码。您仍然可以向向量添加65536个以上的项,但可以保证,只要大小小于此值,&buf[0]就不会更改

考虑到您没有执行任何操作,您正在尝试实现vector,一种方法是根本不使用new,而是使用malloc来分配内存,因此:

char * buf = static_cast<char *>( malloc( BUF_SIZE ) );
当您需要更多空间时,您可以“realloc”指针。一定要先重新锁定到一个临时的,以检查它是否成功

bufNew = static_cast< char * >( realloc( buf, newBufSize ) );
if( bufNew )
     buf = bufNew;
bufNew=static_cast(realloc(buf,newBufSize));
如果(bufNew)
buf=bufNew;
这在这里起作用,因为int是POD类型。如果类型不是POD,则realloc和简单地通过内存移动对象是不安全的,您需要将它们作为对象移动,在每个对象上使用operator=


现在您对这一点有了一些了解,但出于实际目的,您可能希望使用vector。

听起来您正在尝试编写自己的vector类,可以根据需要进行扩展。您可以按如下方式执行此操作:

std::vector<int> buf;
buf.push_back( 1 );
buf.push_back( 2 );
buf.push_back( 3 );

int * intbuf = &buf[0];
int * a; // original pointer
a = new int[5]; // just five elements
现在将其增加到10个元素(创建一个新数组,复制旧内容,回收旧数组的内存,并重新分配数组指针):


有关这种“动态表”的描述和分析,请参见第17.4章。

听起来您正试图编写自己的向量类,可以根据需要进行扩展。您可以按如下方式执行此操作:

int * a; // original pointer
a = new int[5]; // just five elements
现在将其增加到10个元素(创建一个新数组,复制旧内容,回收旧数组的内存,并重新分配数组指针):


有关这种“动态表格”的描述和分析,请参见第17.4章。

这是学校用的吗?如果是的话,你在课堂上检查过数组了吗?这是一个很好的内存泄漏。这是给学校的吗?如果是这样的话,你在课堂上复习过数组了吗?这是一个很好的内存泄漏。我知道,但我正在尝试练习“新建”和“删除”以及模板。
new
delete
vector
list
一样标准
new
delete
在这种情况下不太适用。我知道,但我正在尝试练习“new”和“delete”以及模板。
new
delete
vector
list
一样标准<代码>新建和
删除
在这种情况下不太适用。malloc、placement new和realloc对于本海报来说不必要地复杂。malloc、placement new和realloc对于本海报来说不必要地复杂。