【问题标题】:C++ how to delete a structure?C++如何删除一个结构?
【发布时间】:2011-05-07 06:24:15
【问题描述】:

我创建的结构:

   struct VideoSample
  { 
      const unsigned char * buffer;
      int len;
  };

   VideoSample * newVideoSample = new VideoSample;
   newVideoSample->buffer = buf;
   newVideoSample->len = size;

       //...

现在怎么删除?

【问题讨论】:

  • 谁拥有 缓冲区?您还需要一个析构函数的可能性不为零。

标签: c++ structure


【解决方案1】:

**您创建了 Videosample 的对象,所以您只需使用 delete..

VideoSample * newVideoSample = new VideoSample; 删除 newVideoSample;**

【讨论】:

    【解决方案2】:
    delete newVideSample;
    

    这不会释放您分配给 newVideoSample->buffer 的任何内存 - 您必须在删除之前明确释放它。

    //Free newVideSample->buffer if it was allocated using malloc
    free((void*)(newVideSample->buffer));
    
    //if it was created with new, use `delete` to free it
    delete newVideSample->buffer;
    
    //Now you can safely delete without leaking any memory
    delete newVideSample;
    

    这种释放通常写在类的destructor中,这样当你delete动态创建的对象时会自动调用它。

    感谢@steve 提及 :)

    【讨论】:

    • 五个我 C2664 免费(newVideSample->buffer);线。类似的东西不能将 const unsigned char 转换为 void *
    • 这值得-1 - 用于free 不知道内存来自哪里,并且如果指针被设置,不建议在析构函数中这样做。不要投反对票,因为没有其他答案甚至提到这一点。
    • @Kabumbus 我认为投射会自动发生 - 将缓冲区投射到 (void*) ,你会很高兴的。此外,只有在分配时才在 buffer 上使用 free/delete - 如果如问题所示,缓冲区是使用已分配的指针初始化的(即使在删除 newVideSample 后也使用),则不需要并且不应该释放/删除它
    • 很可能它应该是缓冲区的 delete []。但又一次不知道。
    【解决方案3】:

    在 C++ 中,结构与类完全相同,只是默认情况下所有内容都是公共的,而类默认情况下是私有的。所以一个结构可以有一个析构函数并通过 delete 释放。

    【讨论】:

      【解决方案4】:

      如果您希望 VideoSample 释放其 buffer 成员,则 VideoSample 是一个脆弱的类。它无法知道buf是在堆中使用new[]还是malloc创建的,还是栈上变量的地址。

      【讨论】:

        【解决方案5】:

        分配 -> VideoSample * newVideoSample = new VideoSample;

        删除 -> 删除新的VideoSample;

        如果你在同一个上下文中删除对象,你最好只在堆栈上分配它。 如果您在上下文之外删除它,请不要忘记传递引用。

        最重要的是,如果您要退出进程,请不要删除,这是没有意义的:P

        【讨论】:

        • "如果你要退出进程就不要删除,没有意义" 不。 为什么这是+2?至少,明确地delete 是自我记录和礼貌的。更重要的是,如果操作系统忽略删除对象或 its 资源之一怎么办?它还可以确保您避免在内存泄漏分析器等中出现误报。真的,deleteing 并不难,所以总是这样做。如果您在 [Dr Evil 手指]“不应该”很重要的情况下开始为遗漏开脱,那么当您在 确实如此的情况下忘记 delete 时,您就是在自找麻烦>。 stackoverflow.com/q/677812/2757035
        【解决方案6】:

        使用delete

        VideoSample * newVideoSample = new VideoSample;
        //.. stuffs
        
        delete newVideoSample;
        

        还有一个overload,即delete[]

        VideoSample * newVideoSample = new VideoSample[n];
        //.. stuffs
        
        delete [] newVideoSample;
        

        在现代 C++ 中,始终建议使用智能指针。您可能想使用 boost 库中的 boost::shared_ptr<T>

        【讨论】:

          【解决方案7】:

          delete newVideoSample;

          但是,请考虑使用smart pointer,它会自动释放内存,例如:

          std::auto_ptr<VideoSample> newVideoSample(new VideoSample);
          

          【讨论】:

            【解决方案8】:

            delete newVideoSample 。 在 C++ 中,structclass 相同,但具有默认公共字段。

            【讨论】:

              【解决方案9】:
              delete newVideoSample;
              

              但如果 newdelete 在相同的上下文中,您最好跳过它们并直接在堆栈上创建它:

              VideoSample newVideoSample = {buf, size};
              

              在这种情况下,不需要清理。

              【讨论】:

              • 是的,默认情况下不需要“新建”或“删除”对象。仅当您真正知道为什么需要它时才使用它。
              【解决方案10】:

              除非我遗漏了什么,否则你只需使用delete

              delete newVideoSample;
              

              【讨论】:

                【解决方案11】:

                您正在寻找 delete 关键字:

                delete newVideoSample;
                

                【讨论】:

                  猜你喜欢
                  • 2011-03-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-03-27
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多