在以下情况下会出现什么问题?
What can go wrong in the following scenario?
我有一个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
或内存分配都表明您正在手滚动。
相关文章:
- 警告处理为错误这里有什么问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 当我尝试添加 2 个大字符串时,我无法弄清楚出了什么问题
- 违反const正确性:我应该现实地期待什么问题
- 这个带有模板<类 Vector 的C++代码片段有什么问题>
- 我的逻辑反转字符串中的元音有什么问题?
- 需要以下代码的帮助,下面的代码有什么问题
- 常量公共成员有什么问题?
- 以下代码中的函数模板有什么问题?
- 这个返回元素位置的基于循环的函数有什么问题?
- creat_list2功能有什么问题?
- 格式说明符C++有什么问题
- 任何人都可以告诉我我的 C++ 代码出了什么问题?
- 从 argv[1] 转换为字符 * 字符串后有什么问题?
- 我的堆栈和库存清单程序的结构有什么问题?
- 此工厂功能有什么问题?
- 以下 C++ 代码有什么问题?
- 数组为此合并排序函数提供了正确的输出,但向量给出了不正确的输出.出了什么问题?
- reinterpret_cast,只读访问,简单的可复制类型,会出什么问题?
- 它解决了什么问题,对于非真空初始化,生命周期在初始化之前就开始了