如何在C ++中为struct分配内存?是动态还是静态内存分配?

时间:2018-03-14 07:42:07

标签: c++ memory struct dynamic-memory-allocation static-memory-allocation

我是C ++编程的新手。所以我只是想知道结构的内存分配是静态的还是动态的?这是我基本上拥有的代码。

struct student {
    double average;
    struct subjects sub[course_numbers];
};

struct subjects {
    char name;
   int crn;
   int credits;
};

2 个答案:

答案 0 :(得分:0)

您发布的代码只是数据对象“学生”和“主题”的定义。它只是代码而且既不存在于堆栈中也不存在于堆中,直到您将其用于工作并从中生成实际类型。以下是使用它执行某些操作的代码示例:

//define the struct
struct myStruct
{
    int myInt;
};

// use it
int main(void)
{
    myStruct oStruct{456}; //put on stack, automatically cleaned up at end of main function.
    myStruct* pStruct = new myStruct{654}; //put on heap, must be cleaned up manually.

    delete pStruct; //because you put on heap, clean it up afterwards.
    pStruct = nullptr;

    return 0;
}

答案 1 :(得分:0)

存储区域多于堆栈,还有自动存储和常量存储。您的实例所在的内存取决于您定义实例的方式和位置。

在函数外部声明实例会将实例置于自动存储中。这是声明全局变量和文件全局变量的地方:

My_Struct instance;
// or:
static My_Struct instance;

在函数内声明变量为非静态变量,可以将实例放在堆栈上(假设实现使用了一个):

void Any_Function()
{
  My_Struct instance;
}

同样,允许编译器使用引用或其他方式(处理器缓存)来表示结构,因此您的实例可能不在堆栈中。

使用new分配将实例放入动态内存(a.k.a. heap):

void Another_Function()
{
  My_Struct * p_instance = new My_Struct;
  // ...
  delete p_instance;
}

您也可以将实例放入常量内存,或放置所有常量文字的内存:

const My_Struct instance = {/*...*/};

您还可以通过在函数内声明实例static将实例放入“全局”内存中:

void Yet_Another_Function()
{
  static My_Struct instance;
}

所以,回答你的问题:根据声明实例的方式和位置,将结构放入内存中。内存区域多于staticdynamicstatic有多种定义,因此您必须澄清。通常,dynamic表示在运行时。 static 实例可以引用在编译/构建过程中分配的实例。