动态内存分配
在执行 SQL 查询时,会创建一个“运行时”对象。此运行时包含其自身的分配器方法,该方法用于此查询上下文中的所有内存分配。当查询完成时,此分配器分配的所有内存都会自动释放。 分配器对象是运行时的一个成员,可以在用户定义函数(UDF)内部访问。例如(对于典型的 C++ UDF):
McoSql::Value* gen_quotes(McoSql::Runtime *runtime, McoSql::Vector<McoSql::Value>* args)
{
McoSql::Allocator allocator = runtime->allocator;
...
}
请注意,此函数接收指向运行时对象的指针以及参数向量 args。还期望该函数返回一个由运行时分配器创建的 Value。例如:
return McoSql::IntValue::create(runtime->allocator, nquotes);
函数参数在函数调用之前分配,并在函数返回后销毁。如果应用程序需要在稍后使用某些函数参数(例如存储在其他对象中),则可以将相应的向量元素赋值为 NULL。例如:
args->items[0] = NULL;
也可以在用户定义函数(UDF)内部创建分配器。例如:
McoSql::Value* gen_quotes(McoSql::Runtime *runtime, McoSql::Vector<McoSql::Value>* args)
{
McoSql::Allocator temp_allocator;
...
McoValue *temp_int = McoSql::IntValue::create(runtime->allocator, nquotes);
...
// No need to destroy temp_int, it will be destroyed automatically
}