结构内分配内存的 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++ 使用情况的主要内容,如果未能解决你的问题,请参考以下文章

C++ 动态内存分配(6种情况,好几个例子)

C++内存管理

const分配内存伪常量(C++)

C++ 动态内存分配与结构中的数组

C++经典面试问题

C++程序,内存占用一直增加,最后无法分配内存而中断