我无法理解new关键字的正确用法。我的问题是:

  • 我怀疑以下只是不好的设计吗?
  • 如果没有,我应该在哪里调用delete
  • 如果是这样,更好的做法是什么?

  • #include <string>
    #include <iostream>
    
    struct myOptions {
        int myInt;
        std::string myString;
    };
    
    myOptions* packageOptions() {
        myOptions* options = new myOptions;
        options->myInt = 42;
        options->myString = "hello world";
    
        return options;
    }
    
    int main() {
        myOptions* options = packageOptions();
    
        std::cout << options->myString << std::endl;
        std::cout << options->myInt << std::endl;
    
        delete myOptions; // this just feels wrong to put here
    }
    

    我的直觉告诉我这很不好,因为主要功能不必管理其他功能分配的内存,因为它破坏了某种封装。我考虑过要做一个类的构造函数/解构函数,但这似乎太过分了。

    最佳答案

    没有必要在执行操作时手动地追逐内存。我只是在堆栈上声明您的变量,然后按值返回它。然后,当变量超出范围时,让RAII为您清理内存。

    myOptions packageOptions() {
        myOptions options;
        options.myInt = 42;
        options.myString = "hello world";
    
        return options;
    }
    
    int main() {
        myOptions options = packageOptions();
    
        std::cout << options.myString << std::endl;
        std::cout << options.myInt << std::endl;
    }
    

    07-24 13:41