假设我定义了一个指向任何类型的指针:A* p。
我想稍后分配它,但前提是我最初知道。
A* p;
bool assign_p = condition; // initially
p = assign_p ? new A : NULL; // later
Run Code Online (Sandbox Code Playgroud)
但是,我想避免使用额外的变量(布尔值)以节省空间,因为此过程发生在大型数组上。我的问题是:我可以使用指针作为临时布尔值吗?
A *p = condition ? (A*) 1 : NULL; // initially
A *p = p ? new A : NULL; // later
Run Code Online (Sandbox Code Playgroud)
这仅使用 1 个变量(指针),但即使(A*) 1它指向任何地方,分配是否安全且良好的做法?
union boolA { bool assign; A* p; };
boolA P = {condition}; // initially
P.p = P.assign ? new A : NULL; // later
Run Code Online (Sandbox Code Playgroud)
这也应该只使用指针所需的内存,并且本质上与上面的解决方案相同,也许以更好的方式?但我对工会发生的未定义行为有点困惑。在这方面安全吗?此外,如果我需要拥有许多这样的指针,那么创建联合数组是一个好习惯吗?
这可以通过使用哨兵(以特殊方式解释的实际值,类似于数字 -1 在搜索函数中经常用于指示“未找到”)以安全的方式解决。创建 的单个实例A(将其成员设置为任意但安全的值,例如全零和空值),将其存储为A * sentinel,并将“true”数组元素设置为sentinel。当您准备好分配实际对象时,您只需将数组元素与 进行比较即可sentinel。