cpp 中通过 new 关键字来构建一个对象的数组,不能在构建的过程中就指定需要调用的构造函数吗? - V2EX
请不要在回答技术问题时复制粘贴 AI 生成的内容
NGPONG

cpp 中通过 new 关键字来构建一个对象的数组,不能在构建的过程中就指定需要调用的构造函数吗?

  •  
  •   NGPONG
    NGPONG Mar 22, 2020 2827 views
    This topic created in 2242 days ago, the information mentioned may be changed or developed.

    假设类

    public: Person(char *personName) : m_name(personName) { cout << "Person constructor" << endl; } Person() { } private: char *m_name; }; 

    如下面的创建方式都不好使

    int man(void) { Person *pers = new (Person((char *)"NGPONG"))[1024]; Person *pers = new Person((char *)"NGPONG")[1024]; Person *pers = new Person[1024]((char *)"NGPONG"); } 

    必须要像 c 一样自己申请一块内存然后自个一个一个 new 吗?

    int main(void) { Person **pers = (Person **)malloc(sizeof(Person) * 1024); if (pers == NULL) { exit(EXIT_FAILURE); } for (size_t i = 0; i < 1024; i++) { pers[i] = new Person((char *)"NGPONG"); if (pers[i] == NULL) { exit(EXIT_FAILURE); } } } 
    11 replies    2020-03-22 23:58:04 +08:00
    inhzus
        1
    inhzus  
       Mar 22, 2020 via Android   3
    new 确实不方便,但是答应我,都已经 c++20 了,用 vector 不用 new 好吗?

    vector( size_type count,
    const T& value,
    const Allocator& alloc = Allocator());
    codehz
        2
    codehz  
       Mar 22, 2020   1
    不仅如此,你释放的时候也得一个一个释放,不然就炸了
    你还需要考虑数组中有一个申请失败,怎么按序释放剩下的数组


    这就是为啥大家都用 std::vector<std::unique_ptr<T>> (或者里面用 shared_ptr )
    codehz
        3
    codehz  
       Mar 22, 2020
    (不过 unique_ptr 也不会自动帮你创建对象,你可以考虑自己写一个类,在构造的时候初始化 unique_ptr
    nightwitch
        4
    nightwitch  
       Mar 22, 2020   1
    C++20 了,凡是在库外面裸用 new/delete 的都应该反思一下是不是有更好的方式。
    就你这个需求而言
    栈上可以用 std::array<>构造,堆上用 vector 构造,都能确保任意情况下资源一定不会泄漏。
    nightwitch
        5
    nightwitch  
       Mar 22, 2020
    @codehz vector 里面直接装元素就可以了,vector 的内存在堆上,不需要再套一层 unique_ptr.
    gwy15
        6
    gwy15  
       Mar 22, 2020   2
    如果你非做不可,不做全身难受,那可以这样写:

    int main(void) {
    Person *pers = (Person *)new char[sizeof(Person) * 10];
    for (int i = 0; i < 10; i++) {
    new (&pers[i]) Person("test");
    }
    }

    但是建议用更现代 c++的方式来做,楼上都说得差不多了。
    codehz
        7
    codehz  
       Mar 22, 2020
    @nightwitch (显然是顺着楼主的思路做啊,你这都改变数据结构了
    codehz
        8
    codehz  
       Mar 22, 2020
    @nightwitch (好像我看错了,楼主的结构就是扁平的(
    SamsonWang
        9
    SamsonWang  
       Mar 22, 2020
    ```
    #include <iostream>

    class Person {
    public:
    Person(const char* name)
    : m_name(name) {
    std::cout << "Person constructor" << std::endl;
    }
    ~Person() {
    std::cout << "Person destructor" << std::endl;
    }

    const char* GetName() const {
    return m_name;
    }

    private:
    const char *m_name;
    };

    int main(int argc, char *argv[]) {

    Person *pers = new Person[3]{"name1","name2","name3"};

    for (int i = 0; i < 3; ++i) {
    std::cout << pers[i].GetName() << std::endl;
    }

    delete[] pers;
    pers = nullptr;

    return 0;
    }
    ```

    gcc 4.8.5 编译命令

    ```
    g++ -std=c++11 test.cpp
    ```
    suzper
        10
    suzper  
       Mar 22, 2020 via Android
    @SamsonWang 如果要 new 10000 个 或任意个 Person, 每个都初始化成 name1,你这代码就没法实现这样的扩展了呀!
    ipwx
        11
    ipwx  
       Mar 22, 2020   2
    我觉得楼主的需求更接近于:

    About     Help     Advertise &nbs;   Blog     API     FAQ     Solana     1701 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 42ms UTC 16:26 PVG 00:26 LAX 09:26 JFK 12:26
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86