我正在尝试为恰好是指针的嵌套结构动态分配内存。我在下面编写了一些编写的代码来尝试说明我的问题。
这两个结构体位于两个单独的头文件中,并且代码位于同一个命名空间下。
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_noOfSections
、tiles[i].m_noOfTilesinSecs
、tiles[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_noOfTiles
类 Tiles
数组。下属的内存未初始化。这可以通过提供初始化列表来完成。
tiles = new Tiles[Flr.m_noOfTiles] { value1, value2, value3 };
您必须为每个指针分配内存。当不需要时,按适当的顺序将其从嵌套最多的结构到嵌套较少的结构解除分配。
这可能不是一项简单的任务,具体取决于您需要的操作,并且会在代码中造成相当大的麻烦。这就是 C++ 有构造函数和析构函数的原因。所以:
- 您有什么理由不使用 RAII 吗? https://en.cppreference.com/w/cpp/language/raii
- 您是否有理由不使用标准集合,它们已经实现了 RAII。
- 您有什么理由不使用智能指针吗?
关于c++ - 如何为嵌套指针结构动态分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58038189/