【问题标题】:Add new objects after using "new"使用“new”后添加新对象
【发布时间】:2011-01-18 17:09:38
【问题描述】:

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

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

非常感谢!

【问题讨论】:

  • 这是给学校的吗?如果有,你在课堂上看过数组吗?
  • 这是一个很好的内存泄漏。

标签: c++ pointers object new-operator


【解决方案1】:

您可能应该使用vectorlist

【讨论】:

  • 我知道,但我正在尝试练习“新建”和“删除”以及模板。
  • 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 对于这张海报来说过于复杂了。
      猜你喜欢
      • 2018-12-24
      • 2018-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-12
      相关资源
      最近更新 更多