使用“new”后添加新对象
Posted
技术标签:
【中文标题】使用“new”后添加新对象【英文标题】:Add new objects after using "new" 【发布时间】:2011-01-18 17:09:38 【问题描述】:在我调用 new 之后,如何向指针添加更多对象? (我需要它来上课) 这就是我的意思:
int *a;
a = new int;
a = new int;
非常感谢!
【问题讨论】:
这是给学校的吗?如果有,你在课堂上看过数组吗? 这是一个很好的内存泄漏。 【参考方案1】:您可能应该使用vector 或list。
【讨论】:
我知道,但我正在尝试练习“新建”和“删除”以及模板。new
和 delete
与 vector
和 list
一样标准。 new
和 delete
在这种情况下不太适用。【参考方案2】:
在 C 语言中,您可以使用 realloc
。在 C++ 中,您将使用 STL 的 std::vector
而不是指针。你总是可以做一些丑陋的事情,比如:
int *a;
a = new int[1];
delete [] a;
a = new int[2];
但你会遇到性能下降。
【讨论】:
【参考方案3】:听起来您正在尝试编写自己的可以按需增长的矢量类。你可以这样做:
int * a; // original pointer
a = new int[5]; // just five elements
现在将它增加到 10 个元素(创建一个新数组,复制旧内容,回收旧数组的内存,并重新分配数组指针):
int * tmp = new int[10]; // a new array
memcpy (tmp, a, 5 * sizeof(int)); // copy the old items into the new array
delete [] a; // reclaim the memory from the old array
a = tmp; // reassign a to point to the new, bigger array
请参阅Cormen, Leiserson, Rivest and Stein,第 17.4 章,了解对此类“动态表”的描述和分析。
【讨论】:
【参考方案4】:如果您需要一个连续的缓冲区,请使用向量。
std::vector<int> buf;
buf.push_back( 1 );
buf.push_back( 2 );
buf.push_back( 3 );
int * intbuf = &buf[0];
请注意,如果您向向量中添加更多项目,此指针可能会失效。如果您愿意,可以先这样做来防止这种情况发生:
buf.reserve( 65536 );
或其他数字。您仍然可以向向量添加超过 65536 个项目,但可以保证,只要大小小于此值,&buf[0] 就不会改变。
鉴于您没有执行任何此操作,但您正在尝试实现向量,一种方法是根本不使用 new 而是使用 malloc 分配内存,因此:
char * buf = static_cast<char *>( malloc( BUF_SIZE ) );
现在您可以在这里使用placement new 创建对象
int * intbuf = new( buf + sizeof(int) * N ) int( i );
当您需要更多空间时,您可以“重新分配”您的指针。一定要先重新分配到一个临时的,以检查它是否成功。
bufNew = static_cast< char * >( realloc( buf, newBufSize ) );
if( bufNew )
buf = bufNew;
这在这里有效,因为 int 是 POD 类型。如果类型不是 POD,则重新分配并简单地按内存移动对象是不安全的,您需要将它们作为对象移动,在每个对象上使用 operator=。
现在您对此有所了解,但出于实际目的,您可能希望使用矢量。
【讨论】:
malloc、placement new 和 realloc 对于这张海报来说过于复杂了。以上是关于使用“new”后添加新对象的主要内容,如果未能解决你的问题,请参考以下文章