class ABC
{
public int a;
public int b;
public int c;
}
Gee.HashMap<int, ABC> p;
void fn()
{
p = new Gee.HashMap<int, ABC>();
var x = new ABC();
x.a = 3123;
x.b = 1231;
x.c = 5154;
p.set(1, x);
}这个密码有用吗?或者我的散列集合在x可见范围结束后丢失其数据,即当fn()返回时?
是否应该用指针替换引用x以防止出现这种情况?
应该在p.unset(1)方法之后显式删除这个指针吗?
谢谢。
发布于 2022-10-06 10:02:31
你的代码有效。x在p里面还活着。吉容器使用参考计数。
但是,p对象从未被释放,因为它是一个全局变量。如果将它移动到一个更本地的范围(例如在一个主函数中),它的数据将被释放:
class ABC
{
public int a;
public int b;
public int c;
}
Gee.HashMap<int, ABC> fn()
{
var p = new Gee.HashMap<int, ABC>();
var x = new ABC();
x.a = 3123;
x.b = 1231;
x.c = 5154;
p.set(1, x);
return p;
}
void main() {
Gee.HashMap<int, ABC> p = fn();
stdout.printf("%d\n", p[1].a);
// p and x are both freed here, because their ref count reaches 0
}通常不需要unset,除非您希望手动从HashMap中删除该值。
https://stackoverflow.com/questions/73960572
复制相似问题