【发布时间】:2021-12-31 23:28:42
【问题描述】:
在调查一个奇怪的 tcmalloc 错误时,我和我的同事将错误追溯到一行代码:
soci::session db;
...
db << "INSERT INTO `public.tablename` (..., ..., textvalue) VALUES ('...', '...', :1);",
soci::use(std::to_string(someStruct.getUint32_t()) + "." + std::to_string(someStruct.getUint32_t()));
一切正常,我们将其更改为:
soci::session db;
...
std::string temp = std::to_string(someStruct.getUint32_t()) + "." + std::to_string(someStruct.getUint32_t());
db << "INSERT INTO `public.tablename` (..., ..., textvalue) VALUES ('...', '...', :1);",
soci::use(temp);
我们在第一个版本中遇到了 tcmalloc 错误,因为第一个代码 sn-p 想要在参数列表中组装此字符串的位置分配大约 1.8GB,并且相应系统上没有足够的可用内存。 在我们将第二个代码 sn-p 中所见的字符串组装外包后,此错误不再发生。显然,这个字符串由 2 个整数和一个点组成,不需要任何接近 1.8GB 的空间。
如果有人能向我解释到底出了什么问题,我将不胜感激。我们怀疑它与一些黑色社会魔法相关的模板推导有关,但不确定。
【问题讨论】:
-
来自soci.sourceforge.net/doc/master/binding "对象生命周期和不变性" 他们会警告您的问题。与类型推导无关,但与
soci::use参数的生命周期无关。 -
谢谢!这解释了它,非常感谢你:)