结构内分配内存的 C++ 使用情况
Posted
技术标签:
【中文标题】结构内分配内存的 C++ 使用情况【英文标题】:C++ usage of allocated memory inside structs 【发布时间】:2020-11-27 23:34:41 【问题描述】:所以,我正在做一些哈克等级的练习,我找到了this exercise。
简而言之,这是一个间隔调度问题,但我怀疑的是指针和数据结构。
下面这段代码是我怀疑的一个简单版本。
我的疑问在于 initialize 函数。当程序完成它时,ptr 指针变量只有一个 arrayOfA 实例,只有第一个条目,我希望有 N 的大小。
那么我对这个数据结构和它的指针做错了什么?
我不想使用另一个库作为向量和东西,因为我认为没有必要。
#include <iostream>
struct A
unsigned int startTime;
unsigned int duration;
unsigned int endTime;
;
struct B
int size;
A* arrayOfA = new A[size];
;
B* initialize(int start_time[], int duration[], int n)
B* pointer = new B();
pointer->size = n;
for (int i = 0; i < n; i++)
pointer->arrayOfA[i].startTime = start_time[i];
pointer->arrayOfA[i].duration = duration[i];
pointer->arrayOfA[i].endTime = start_time[i] + duration[i];
return pointer;
int main()
//initialization
int n = 6;
int arrayOfStart[] = 1, 3, 0, 5, 5, 8 ;
int arrayOfDuration[] = 1, 1, 6, 2, 4, 1 ;
B* ptr;
ptr = initialize(arrayOfStart, arrayOfDuration, n);
for (int i = 0; i < n; i++)
std::cout << ptr->arrayOfA[i].startTime << std::endl;
【问题讨论】:
A* arrayOfA = new A[size];
调用 未定义的行为,因为 size
在执行时尚未初始化
我不想使用另一个库作为向量和东西,因为我认为不需要它。 -- 我猜内存泄漏是可以的?您的程序在几个地方泄漏了内存。
如果这是一个学术练习来了解像std::vector
这样的东西是如何实现的,那将是合理的。但除此之外一般最好使用标准库,效果很好。
【参考方案1】:
我不想使用另一个库作为向量和东西,因为我认为不需要它
你把这个简单的例子弄错了——而且这个简单的例子实际上并没有那么容易正确实现——这是你错了的确凿证据。
拥有标准库的全部意义在于,手动实现这些东西很少有充分的理由,而且很容易出错。而std::vector
不是“另一个库”,它由标准库提供是有原因的。
ptr 指针变量只有一个 arrayOfA 实例
它应该只有一个数组。您的意思是,大概是数组的大小错误?你是怎么告诉的?当您尝试读取所有 6 个元素时发生了什么?
不管怎样,眼前的问题是
A* arrayOfA = new A[size];
... 这应该放在构造函数中。您必须推迟评估,直到在您知道size
的值之后。
那么你也应该写一个析构函数,然后你应该写复制构造函数、复制赋值运算符和移动等价物。
但是,如果您学习并使用 std::vector
代替 - 您将在调试数组处理代码的时间内解决问题。
提供常用工具库的全部意义在于,您可以学习一次并重复使用您的知识。如果您在每个hackerrank 问题中编写自己的裸数组代码,那么您很容易在每个问题中遇到不同 错误,而且您没有积累任何可以在下一个问题中重复使用的知识。
【讨论】:
谢谢,我看到了我犯的菜鸟错误。关于 std::vector,我不想使用它,因为程序从用户那里接收数组的大小,并且在这个特定的练习中不需要调整大小或 push_back 等。再次感谢您的帮助。【参考方案2】:鉴于此结构:
struct B
int size;
A* arrayOfA = new A[size];
;
默认的B
将有一个指向size
元素数组的指针。由于size
未初始化,因此会调用未定义的行为。
相反,您可以这样做:
struct B
int size;
A* arrayOfA;
;
设置size
成员后,就可以分配合适的内存了:
pointer->size = n;
pointer->arrayOfA = new A[pointer->size];
另外,当程序不再需要此内存时,不要忘记删除它。
【讨论】:
附录:请记住struct
可以有构造函数,因此您可以轻松确保获取 B
的行为会强制正确初始化 B
。以上是关于结构内分配内存的 C++ 使用情况的主要内容,如果未能解决你的问题,请参考以下文章