c++ - 如何为嵌套指针结构动态分配内存?

标签 c++ arrays algorithm class dynamic-memory-allocation

我正在尝试为恰好是指针的嵌套结构动态分配内存。我在下面编写了一些编写的代码来尝试说明我的问题。

这两个结构体位于两个单独的头文件中,并且代码位于同一个命名空间下。

Tiles.h

struct Tiles
{
    int* m_noOfSections;
    int* m_noOfTilesInSecs;
    char* m_TileName;
};
// functions omitted

Flooring.h

struct Flooring
{
    Tiles* m_Tiles;
    int m_noOfTiles;
    char* m_FlooringName;
};
void read(Tiles&);

我正在为 Flooring.h 编写函数定义,其中我必须动态分配 Tiles 数组,数组的大小在此之前已确定来自用户输入的函数。

我尝试使用以下代码,但遇到了问题:

Flooring.cpp

void read(Flooring&Flr) 
{
      Tiles* tiles;
      tiles = new Tiles[Flr.m_noOfTiles];

      for (int i = 0; i < Flr.m_noOfTiles; i++) {
          cout << i + 1 << ": ";
          read(tiles[i]);
      }
}

注意:read(tiles[i]); [声明:void read(Tiles&)]函数将值赋给Tiles<的数据成员。我已经测试了 Tiles 文件中的功能,它们按预期工作。所以我没有包含这些代码。我相信问题出在我的 Flooring.cpp 实现文件中。

我的期望是上面的读取函数会将值分配给: tiles[i].m_noOfSectionstiles[i].m_noOfTilesinSecstiles[i].m_tileName

问题之一是我没有机会输入tileName,运行代码时它会跳过我通常输入tileName的部分。

输出如下:

Enter the number of sets of tiles: Enter number of sections: [user is able 
    to input value here, but not before when asked to enter the number of the set of tiles]

Tiles.cpp

void read(char* tileName)
{
    cout << "Enter tile name: ";
    read(tileName, 15, "error message") ;
}

具有三个参数的 read 函数的函数定义如下。该函数是在此作业中预先定义的。我也检查了该功能,没有发现任何问题,但无论是否有帮助,我都会发布它。

void read(char* str, int len, const char* errorMessage)
{
      bool ok;
      do 
      {
         ok = true;
         cin.getline(str, len+1, '\n');
         if (cin.fail()) {
            cin.clear();
            cin.ignore(1000, '\n');
            ok = false;
         }
      }while(!ok && cout << errorMessage);
   }

我希望这是足够的信息,如果我的格式不充分,或者如果我的术语不合适,我深表歉意,我对各种编程仍然很陌生。如果我忘记添加一些信息,请告诉我。

最佳答案

new 表达式不会分配任何内容,它只会在您提供这些值时进行值初始化,或者调用构造函数并向其传递参数。

tiles = new Tiles[Flr.m_noOfTiles];

使用垃圾非 nullptr 指针和值创建 Flr.m_noOfTilesTiles 数组。下属的内存未初始化。这可以通过提供初始化列表来完成。

tiles = new Tiles[Flr.m_noOfTiles] { value1, value2, value3 };

您必须为每个指针分配内存。当不需要时,按适当的顺序将其从嵌套最多的结构到嵌套较少的结构解除分配。

这可能不是一项简单的任务,具体取决于您需要的操作,并且会在代码中造成相当大的麻烦。这就是 C++ 有构造函数和析构函数的原因。所以:

  1. 您有什么理由不使用 RAII 吗? https://en.cppreference.com/w/cpp/language/raii
  2. 您是否有理由不使用标准集合,它们已经实现了 RAII。
  3. 您有什么理由不使用智能指针吗?

关于c++ - 如何为嵌套指针结构动态分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58038189/

相关文章:

C++ 和程序集 : call 'operator new' and 'operator delete' with ASM

java - 检查二叉树是否为 BST 的函数总是返回 true

c++ - 使用指针复制构造函数

c++ - 为什么这个取消注释的宏在 clang 中无效但在 msvc 中有效

c++ - VST GUI 反馈 (C++)

c - 我想创建一个数组,其成员是其他数组的一部分。我无法找出错误

java - 读取外部文本文件并存储到数组中

javascript - 如何最好地将复杂的 JavaScript 对象传递给 PHP?

algorithm - 如何在 ListView 中显示字符串树?

java - 使用 for 循环创建网格图