Compiler errors 转让所有权(精灵/Vala)
有一个简单的例子:Compiler errors 转让所有权(精灵/Vala),compiler-errors,vala,genie,Compiler Errors,Vala,Genie,有一个简单的例子: struct MyStruct a: int b: int def my_proc(): unowned list of MyStruct var result = new list of MyStruct var my_struct = MyStruct() for var i = 1 to 10 my_struct.a = i my_struct.b = i*i result.add
struct MyStruct
a: int
b: int
def my_proc(): unowned list of MyStruct
var result = new list of MyStruct
var my_struct = MyStruct()
for var i = 1 to 10
my_struct.a = i
my_struct.b = i*i
result.add(my_struct)
return result
init
pass
在编译这段代码时,有一个错误:“作为返回值和方法返回类型使用的具有强引用的局部变量尚未声明为转移所有权”。如何更改编译成功的代码?精灵列表实际上是一个“伪装”的
Gee.list
,它是一种类类型,因此将被引用计数
此外,类型推断的var
变量当前始终是一个自有变量(Vala错误跟踪器中有一个关于此的错误报告)
因此,result
是对类实例的强引用。您不能将其作为无主引用返回
我强烈建议您对MyStruct
使用类而不是结构
否则,您将有内存管理问题(结构没有引用计数)
您不必担心复制和所有权:
class MyStruct
a: int
b: int
def my_proc(): list of MyStruct
var result = new list of MyStruct
for var i = 1 to 10
var my_struct = new MyStruct()
my_struct.a = i
my_struct.b = i*i
result.add(my_struct)
return result
init
pass
编辑:如果希望列表包含多个值,还必须在循环中分配my_struct!我已经更新了我的代码来反映这一点。精灵列表实际上是一个
Gee.list
中的“伪装”,这是一种类类型,因此它将被引用计数
此外,类型推断的var
变量当前始终是一个自有变量(Vala错误跟踪器中有一个关于此的错误报告)
因此,result
是对类实例的强引用。您不能将其作为无主引用返回
我强烈建议您对MyStruct
使用类而不是结构
否则,您将有内存管理问题(结构没有引用计数)
您不必担心复制和所有权:
class MyStruct
a: int
b: int
def my_proc(): list of MyStruct
var result = new list of MyStruct
for var i = 1 to 10
var my_struct = new MyStruct()
my_struct.a = i
my_struct.b = i*i
result.add(my_struct)
return result
init
pass
编辑:如果希望列表包含多个值,还必须在循环中分配my_struct!我已经更新了代码以反映这一点。在任何给定时间,必须至少有一个对象引用。在这里,您创建一个变量
result
,该变量引用一个列表。当您返回它时,您坚持它是MyStruct的无主列表
。这意味着返回没有引用,result
超出范围,因此列表现在没有引用,将被释放
您实际上是在返回一个悬而未决的引用。返回MyStruct的
列表
,以便调用者有一个引用,或者将一个副本置于某个共享状态(全局变量或字段)。在任何给定时间,必须至少有一个对对象的引用。在这里,您创建一个变量result
,该变量引用一个列表。当您返回它时,您坚持它是MyStruct的无主列表
。这意味着返回没有引用,result
超出范围,因此列表现在没有引用,将被释放
您实际上是在返回一个悬而未决的引用。返回MyStruct的
列表
,这样调用者就有了一个引用,或者将一个副本置于某个共享状态(全局变量或字段)。是什么让你认为返回值应该是无主的
如果是因为没有unowned
Vala编译器给出了“错误:'MyStruct'不是受支持的泛型类型参数,请使用“?”框选值类型”
,然后您可以尝试使用MyStruct?
列表。这个“框”[1][2]是基本的C数据类型,因此它可以在基础的GObject类型系统中使用
如果是因为您阅读了本教程以及“弱引用”、“无主引用”、“所有权转移”和“指针”部分,那么我认为您应该将这些主题视为高级主题。我认为他们应该在某个时候被转移到一个单独的页面上,供那些想深入挖掘精灵的人使用
Vala编译器和Genie帮助了内存管理。这意味着你在后台会处理好一切。Vala编译器具有合理的默认行为,因此您无需进行更改
作为一名精灵程序员,您应该知道与C库接口的可空类型,并且在创建循环引用时,引用计数可能会导致内存泄漏[3]。除此之外,对于那些真正想深入研究精灵如何工作和修复问题的人来说,请查看精灵教程中该部分的主题
结构可以被认为是对象的先驱。结构是一种复合数据类型。Vala/Genie中结构的内存由堆栈上的C编译器处理[4]。这可能会给他们带来性能优势。但是,一般来说,最好对复合数据类型使用类,因为它们更适合底层的GObject类型系统。但是,如果您试图对某些代码进行大量优化以提高速度[5],或与使用结构的C库进行接口,则可能需要使用结构
因此,简短的答案是使用Jens关于使用类的解决方案,除非你有充分的理由不这样做
[1] -
[2] -
[3] -
[4] -
[5] -是什么让你认为返回值应该是无主的 如果是因为没有
unowned
Vala编译器给出了“错误:'MyStruct'不是受支持的泛型类型参数,请使用“?”框选值类型”
,然后您可以尝试使用MyStruct?
列表。这个“框”[1][2]是基本的C数据类型,因此它可以在基础的GObject类型系统中使用
如果是因为您阅读了本教程以及“弱引用”、“无主引用”、“所有权转移”和“指针”部分,那么我认为您应该将这些主题视为高级主题。我认为他们应该在某个时候被转移到一个单独的页面上,供那些想深入挖掘精灵的人使用
Vala编译器和Genie帮助了内存管理。这意味着你在后台会处理好一切。Vala编译器具有