在以下情况下会出现什么问题?

What can go wrong in the following scenario?

本文关键字:什么 问题 情况下      更新时间:2023-10-16

我有一个struct定义如下:

typedef struct {
UINT   idLength;
UINT * ids;
} AsnObjectIdentifier;

我有一个函数,它有一个上述结构的堆栈分配变量,我将这个变量作为对其他函数的引用传递给它来填充其中的值。

void someFunc() {
//code
AsnObjectIdentifier temp;    //this is a stack allocated variable
someOtherFunc(temp);
}

在填充上述堆栈变量的函数中,我正在创建一个分配给数组UINT堆并将其分配给ids

void someOtherFunc(AsnObjectIdentifier& oidVar) {
//code
UINT* arr = new UINT[someSize];     //this is a heap allocated variable
oidVar.ids = arr;
//some other code
}

当我回到调用函数时,我有一个堆栈变量,它内部包含一个堆分配变量。

我做错了什么吗?我是在玩两个不同记忆的世界吗?它会导致问题吗?

此外,如果在someFunc()中我创建了一个新的AsnObjectIdentifier变量并使用malloc为其分配内存,我可以将堆栈分配变量中的UINT数组分配给这个AsnObjectIdentifier变量的新堆吗?这也会有任何问题吗?

我做错了什么吗?

是的,我会说所有权是一个问题。从您显示的内容来看,所有权尚不清楚,也不清楚谁应该删除arr(以及他们如何知道他们应该使用delete[](。

出于这个原因,原始指针的传统含义(c++,而不是c(通常是"非拥有"。

在您的示例中,直接的方法可能只是使用std::vector<UINT>而不是AsnObjectIdentifier struct

我是在玩两个不同的世界吗 记忆?它会导致问题吗?

它看起来不像那样,但您应该避免手动滚动内存管理new[]或极端情况下,甚至任何类型的new或内存分配都表明您正在手滚动。