【问题标题】:Using new on void pointer在 void 指针上使用 new
【发布时间】:2013-01-01 16:03:40
【问题描述】:
int main()
{
    void* Foo = new???
    delete Foo;
}

你是怎么做类似上述的事情的?你不能放new void[size]。而且我不想知道如何使用malloc()free()。我已经知道这行得通。我很好奇,想知道 new 和 delete 是怎么做的。

我在谷歌上搜索了一下,看到了一些关于 operator new(size) 的信息;和operator delete(size);

它们和new / delete 有什么区别?为什么 C++ 不仅仅允许新的void* [size]

【问题讨论】:

  • 为什么要在 C++ 中使用void *
  • 我很好奇,因为我看到它是在 C 中完成的。在 C 中,我看到有人这样做 void* Foo = malloc(size);不是一样的吗?
  • 不,不是。在 C++ 中,new type[3] 分配 3 倍于 malloc 必须看起来像这样的类型的大小:malloc(3*sizeof(type))

标签: c++


【解决方案1】:

这样就可以了:

int main()
{
    void* Foo = ::operator new(N);
    ::operator delete(Foo);
}

这些运算符分配/释放以字节为单位的原始内存,就像malloc

【讨论】:

    【解决方案2】:

    为什么 C++ 不仅仅允许 new void[size]?

    因为void 不是对象;它没有大小!应该分配多少空间?请记住,new T[size]大约相当于malloc(sizeof(T) * size)

    如果你只想要一个原始字节数组,那么你可以使用char*


    * 当然,因为这是 C++,你应该使用类似 std::vector<char> 的东西来避免内存泄漏和异常安全问题。

    【讨论】:

    • 好的,但是为什么 Malloc 允许呢? Void 仍然不是 C 中的对象。
    • @CantChooseUsernames: malloc 不允许这样做...类似的\malloc 调用将是malloc(sizeof(void)*N),它不会编译。
    • @CantChooseUsernames:它不“允许”它; malloc 不是类型安全的;为了能够将它分配给任何指针类型,它需要返回一个void *
    • 认为原始内存应该使用new char[n]:分配的内存包含char类型的对象。使用operator new(n)operator new[](n)(或使用合适的分配器成员)分配原始内存。
    【解决方案3】:

    C++ 在使用new T 的一些变体分配的构造对象中传播。或 new T[n] 用于某些类型 T。如果你真的需要未初始化的内存(这种情况很少见),你可以使用operator new()operator delete() 分配/释放它:

    void* ptr = operator new(size);
    operator delete(ptr);
    

    (数组形式类似)

    【讨论】:

      【解决方案4】:

      void * 可以转换为任何指针类型。您可以简单地执行void *Foo = new int 或您想要的任何其他类型。但在 C++ 中确实没有理由这样做。

      【讨论】:

        【解决方案5】:

        你可以的

        void* data = new char[num_of_bytes];
        

        以类似于 malloc 的方式分配一些内存

        【讨论】:

          猜你喜欢
          • 2019-05-24
          • 2014-05-30
          • 1970-01-01
          • 1970-01-01
          • 2013-12-18
          • 2021-04-29
          • 1970-01-01
          • 2014-06-15
          • 1970-01-01
          相关资源
          最近更新 更多