【问题标题】:C++: Overwrite an element in a new-created arrayC ++:覆盖新创建的数组中的元素
【发布时间】:2010-07-07 13:45:49
【问题描述】:

如果我有一个这样创建的数组:

MyType *array = new MyType[10];

我想覆盖其中一个元素,我必须先delete 像这样的旧元素:

delete &array[5];
array[5] = *(new MyType());

或者这是完全错误的,我是否必须使用“指向指针的指针”之类的东西来修复这项工作?如果是这样,请问如何......

谢谢

【问题讨论】:

    标签: c++ arrays memory-management


    【解决方案1】:

    这是一个的数组,而不是指针。所以你就这样做

    array[5] = MyType();
    

    这需要MyType 支持赋值运算符。


    顺便说一句,在 C++ 中很少需要像这样手动分配数组。取消 newdelete 并改用 std::vector

    std::vector<MyType> array(10);
    array[5] = MyType();
    

    请注意,无需删除任何内容。

    【讨论】:

    • +1 用于推荐 std::vector。似乎做得不够:)
    【解决方案2】:

    没有。

    数组的单个元素不是新的,只有数组本身是新的。

    array[5] = MyType();   // note no  `new` here.
    

    【讨论】:

      【解决方案3】:

      您声明了一个MyTypes 数组,不是 指向MyTypes 的指针。因为您没有new 数组中的元素,所以您也没有delete 它们。相反,只需这样做:

      array[5] = MyType();
      

      请注意,您也可以使用 std::vector&lt;MyType&gt; 将您的 MyTypes 放在堆上,而不必担心 C++ 数组的麻烦。

      std::vector<MyType> myTypes(10);
      myTypes[5] = MyType();
      

      【讨论】:

        【解决方案4】:

        您可以就地调用析构函数,然后使用placement new。

        【讨论】:

        • 是的,你可以。不过,这是一项先进的技术,而且考虑到这个问题非常基础,这可能不是他应该做的。
        • @Thomas:是的,但是这个解决方案不需要赋值运算符,这很好。
        • @Thomas:哈哈!确实是的。这个问题很基本......但我混淆了new T[...]和一个简单的new
        猜你喜欢
        • 1970-01-01
        • 2013-03-03
        • 1970-01-01
        • 2014-08-27
        • 2020-05-11
        • 2023-03-12
        • 1970-01-01
        • 2012-08-11
        相关资源
        最近更新 更多