【问题标题】:C++ return array without dynamic memory allocation?没有动态内存分配的C++返回数组?
【发布时间】:2017-12-13 05:49:00
【问题描述】:

如果没有动态内存分配,我找不到返回数组的方法。我会用一个例子来详细解释一下:
使用动态内存分配

Device* getConnectedDevices() {
    // scan for devices.
    Device *connectedDevices = new Device[deviceCount]; // Dynamically allocate memory for the Devices
    // Get for each device an ID
    return connectedDevices;
}
void doSomething() {
    // some code
    // I need a list with all the connected devices!!
    Device *connectedDevices;
    connectedDevices = getConnectedDevices();
    // do something with the array
}

doSomething() 不知道数组的大小,所以我使用了一个结构来解决这个问题:

struct deviceArray {
    Device* devices;
    int deviceCount;
};

没有动态内存分配: 我不知道该怎么做。我尝试了以下方法:

  • 通过引用传递。问题:我们在扫描之前不知道数组大小。
  • 返回而不进行动态内存分配(局部变量)。问题:对象不再存在(当然)。

【问题讨论】:

  • 不要手动分配任何东西,在 c++ 中只需使用 std::vector 或类似的类。
  • 返回local pointer 总是一场灾难,因为该地址在函数退出时无效。因此,需要动态分配
  • std::vector 使用动态内存分配。不同之处在于您的函数不需要显式管理动态分配的内存 - 向量管理自己的内存。
  • @dlmeetei 使用new,内存是在堆上分配的,因此返回该分配的指针是有效的。如果对象将在堆栈​​上创建并且地址将使用& 返回,那么它将是无效的。
  • 你无法避免动态内存,因为只有动态内存比函数持续时间更长。

标签: c++ arrays memory memory-management


【解决方案1】:

你不需要为此new任何东西,

std::vector<Device> getConnectedDevices()
{
    std::vector<Device> devices;
    // Fill `devices' with devices.push_back()
    return devices;
}

您可以通过多种不同方式遍历设备列表,例如使用 iterators

通常你在 C++ 中根本不需要指针,如果你知道如何使用引用和 STL 容器,你可以在没有单个指针的情况下做任何你想做的事情。然而,在某些情况下使用指针确实有意义,但我怀疑这是其中之一。

【讨论】:

  • 函数退出时地址无效
  • @dlmeetei 此代码中根本没有涉及地址。只有当你返回一个指向局部变量的指针时,例如return &amp;devices 才会有问题。
  • 局部变量在进入函数时存在,在函数退出时结束生命
  • @IharobAlAsimi “会涉及复制。” 我非常怀疑。我会指望 RVO 移动。
  • 即使没有RVO,它也将是一个移动而不是一个副本。
【解决方案2】:

一般来说,如果没有动态内存分配,就不可能这样做。
随之而来的问题(跟踪大小、正确释放等)很常见。

您描述的这些问题在 c++ 中使用 container classesdynamic memory management smart pointers 解决。

在您的情况下,使用std::vector&lt;Device&gt; 来表示设备列表并向您隐藏动态内存管理的细节和复杂性是合适的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2021-04-02
    • 1970-01-01
    • 2021-07-17
    • 2013-05-24
    相关资源
    最近更新 更多