使用“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。

【讨论】:

我知道,但我正在尝试练习“新建”和“删除”以及模板。 newdeletevectorlist 一样标准。 newdelete 在这种情况下不太适用。【参考方案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”后添加新对象的主要内容,如果未能解决你的问题,请参考以下文章

js中的new()到底做了些什么??

new实例化函数的过程

在Ruby中获取本月的最后一天

如何向字典添加新键?

new和getInstance实例化对象的区别

JavaScript初学者必看“new”