gpt4 book ai didi

c++ - 为什么 void* 在 C++ 中确实不好?有哪些选择?

转载 作者:行者123 更新时间:2023-12-05 08:29:47 25 4
gpt4 key购买 nike

我正在做一个项目来实现 this Multi-Join algorithm .我想到的代码看起来像这样:

template <typename A, typename B, typename C>
vector<tuple<A,B,C>> multi_join(vector<pair<A,B>> R1, vector<pair<B,C>> R2, vector<pair<A,C>> R3)
{
void* existing = new vector<tuple<>>;
void* p1, p2, p3;

p1 = &propose<A>(R1, *(vector<tuple<>>*) existing); // Returns vector<tuple<A>>
p2 = &propose<A>(R2, *(vector<tuple<>>*) existing);
p3 = &propose<A>(R3, *(vector<tuple<>>*) existing);

existing = &intersect(*(vector<tuple<A>>*) p1, *(vector<tuple<A>>*) p2, *(vector<tuple<A>>*) p3);

p1 = &propose<B>(R1, *(vector<tuple<A>>*) existing); // Returns vector<tuple<A, B>>
p2 = &propose<B>(R2, *(vector<tuple<A>>*) existing);
p3 = &propose<B>(R3, *(vector<tuple<A>>*) existing);

existing = &intersect(*(vector<tuple<A, B>>*) p1, *(vector<tuple<A, B>>*) p2, *(vector<tuple<A, B>>*) p3);

p1 = &propose<C>(R1, *(vector<tuple<A, B>>*) existing); // Returns vector<tuple<A, B, C>>
p2 = &propose<C>(R2, *(vector<tuple<A, B>>*) existing);
p3 = &propose<C>(R3, *(vector<tuple<A, B>>*) existing);

existing = &intersect(*(vector<tuple<A, B, C>>*) p1, *(vector<tuple<A, B, C>>*) p2, *(vector<tuple<A, B, C>>*) p3);

return *(vector<tuple<A, B, C>>*) existing;
}

注意如何 existing必须来自 vector<tuple<>> 类型至 vector<tuple<A>>vector<tuple<A, B>>最后到vector<tuple<A, B, C>> .这是一个有限的例子,但我们的想法是最终做到这一点,这样就可以有任意数量的输入 vector 。

我研究了如何尝试做到这一点,并且 void*似乎是最简单的方法,但我也遇到过一些消息来源说这是错误的代码。

我有什么选择?还有其他方法吗?

最佳答案

在你代码的任何一行,existing 的类型已知且固定。

auto va1 = propose<A>(R1, std::vector<std::tuple<>>{}); // Returns vector<tuple<A>>
auto va2 = propose<A>(R2, std::vector<std::tuple<>>{});
auto va3 = propose<A>(R3, std::vector<std::tuple<>>{});

auto AIntersect = intersect(va1, va2, va3);

auto vab1 = propose<B>(R1, AIntersect); // Returns vector<tuple<A, B>>
auto vab2 = propose<B>(R2, AIntersect); // Returns vector<tuple<A, B>>
auto vab3 = propose<B>(R3, AIntersect); // Returns vector<tuple<A, B>>

auto ABIntersect = intersect(vab1, vab2, vab3);

auto vabc1 = propose<c>(R1, ABIntersect); // Returns vector<tuple<A, B, C>>
auto vabc2 = propose<c>(R2, ABIntersect); // Returns vector<tuple<A, B, C>>
auto vabc3 = propose<C>(R3, ABIntersect); // Returns vector<tuple<A, B, C>>

auto ABCIntersect = intersect(vabc1, vabc2, vabc3);
return ABCIntersect;

这不再采用指向函数返回值的指针 (ick),并为所有内容赋予其正确的类型名称。它也短得多。

顺便说一句,如果你曾经new std::vector您的代码有 99.9% 的可能性设计不正确。 std::vector管理堆上的数据缓冲区,将其放在堆上几乎总是表明您搞砸了并且无意识地替换了 new int[100]new std::vector<int> .

您的代码称为 new从来没有调用delete ;它泄漏了。

你的代码取了intersect的返回值地址和 propose .谁拥有那段内存?我没有任何线索;它可能悬而未决,而您的代码确实存在 UB。

所以我把它改成了auto并存储 std::vector干净地管理堆分配的返回值。

关于c++ - 为什么 void* 在 C++ 中确实不好?有哪些选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68367859/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com