问题标签 [temporary-objects]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - std:ostringstream 和 -std=c++11 出现内存错误?
编辑:感谢所有指出问题的人,并在 Stack Overflow 上进行了讨论。我自己投了最后一票。
一个相关的问题:CPP Reference 既不是临时的,ostringstream
也不ostringstream::str
是临时的。这么多人怎么知道的?或者是否有我应该查阅的不同文件?
我在使用 GCC 4.7.2 的 Debian 7.3 (x64)-std=c++11
和std::ostringstream
. 它导致了像https://stackoverflow.com/questions/21260815/which-r-in-this-create-table-error-message这样的结果。
完整的程序使用 Sqlite。从命令行与 Valgrind 运行简化案例会打印 2 个不同的错误。整个简化案例程序可在Code Viewer上找到(我认为在这里发布整个示例有点长)。它所做的只是初始化 Sqlite,打开数据库,创建表,关闭数据库,以及初始化数据库。如果发生错误,它会报告错误。没有其他事情发生。
这是简化案例程序的一部分,它只是尝试创建一个表。如果表存在,它应该产生一个错误(它确实):
但是,在命令行下,消息是:
在 Valgrind 下,消息是:
该程序大量使用ostringstream
.Valgrind 围绕它们产生了近 13 个问题,其中 9 个涉及operator delete(void*)
底层basic_string
. 例如,下面显示了一个(第 76 行来自t.cpp
is const char* stmt = qs.str().c_str();
):
有人对这里发生的事情有任何想法吗?是ostringstream
吗?或者也许是 GCC 4.7.2?或者也许是 Debian 的端口?
(对于开放式问题,我很抱歉。我已经无事可做)。
c++ - ostringstream、.str() 和重置/清除流
我正在用 std:ostringstream 和 -std=c++11 从内存错误中舔我的伤口?,我有一个相关的问题。
如果以下返回一个临时的,那么它reserve
没有效果并且char*
无效:
那么以下如何清除ostringstream
(来自如何重用ostringstream?):
我了解clear()
将重置流的标志;但据我所知,str("")
它将在临时而不是基础字符串上运行。
那么如何str("")
重置流呢?
c++ - 我可以访问临时对象的成员吗?
如果我通过使用创建临时对象class-type-name(parameters).member
并假定构造函数已完成,我可以访问对象的成员吗?
考虑以下示例:
我访问后是否需要立即完成 A 的构造函数state
?
multithreading - 临时托管对象未正确从子上下文合并到主上下文
我有一个多线程应用程序,我需要将私有上下文合并到主上下文,而主上下文又连接到持久存储控制器。
我还需要创建不受管理的临时对象(直到我后来决定管理它们)。
首先,我尝试按如下方式创建我的临时对象;
在决定是否保留该对象后,我就简单了;
在我使应用程序多线程之前,这很好用,但是现在在稍微拆开东西并通过子/父上下文添加多线程并发之后,结果并不像预期的那样。
通过查看上下文的“registeredObjects”,我可以看到我创建的,现在插入的用户是在 privateContext 中管理的。保存后,mainContext 会发生相应的变化,我可以看到它 hasChanges 并且在 registeredObjects 中现在有一个对象。
但仔细观察 mainContext 中的 THAT registeredObject,发现它已被清空。没有内容。根据类型,所有属性都是 nil 或 0。因此,人们会认为这可能是因为 objectId 不一样......但它是 ;( 它是同一个对象。但没有内容。
我试图在这里的另一篇文章中就这个问题提出一些意见,但没有成功。
无论如何,我终于通过改变我创建对象的方式来让事情发挥作用。
突然间,我的子对象被合并到 mainContext 而没有丢失它们的内容,原因我不知道,但不幸的是,这也导致我不能再创建临时的非托管对象......;(我读到 Marcus Zarra 支持我的第一种方法是创建非托管对象,但这不适用于我的多线程应用程序中的合并上下文...
期待任何想法和想法——我是唯一一个试图在异步工作线程中创建临时对象的人吗,我只想管理/合并它们的子集到 mainContext?
编辑
具体代码显示什么是有效的,更重要的是什么是无效的;
以上不起作用,因为它创建了一个临时对象,然后将其插入到上下文中。然而,这个轻微的 mod 让事情变得正常,但阻止我拥有临时对象......;
因此,我想知道;有什么不同?显然,肯定有一些区别,但我不明白。
php - 内存中的临时 MySql 数据库仅用于 hacky IPC?
我有两个需要通信的 PHP 脚本。我知道 PHP 中的 IPC 并不是一个真正的东西。我在想办法做到这一点,两个脚本都访问 MySQL 服务器上的同一个数据库。通信不需要是实时的(但需要相对较快)。
我认为通过表格来回传递数据将是一种很好的方法。
问题:我想确保这个表只驻留在内存中。主数据库应用程序是 70% 读取/30% 写入,但写入很少是更新。数据库会随着时间的推移而增长,但很少会删除任何内容。为了速度,数据库位于 SSD 上。我对使用 IPC 数据库的担忧是不断的写入和删除——所以我想确保数据库只在内存中。不需要坚持。
我也知道(我说得对吗?)临时表在会话关闭时被销毁 - 但它们也仅对创建它们的会话可用。所以那不是一个选择。
有没有办法制作一个永远不会真正击中磁盘的表?我不想在 6 个月后烧毁 SSD,因为 IPC 猛烈地写入磁盘。
c++ - 绑定到引用时临时对象生命周期扩展异常的基本原理是什么?
在 C++11 标准的 12.2 中:
引用绑定到的临时对象或作为引用绑定到的子对象的完整对象的临时对象在引用的生命周期内持续存在,但以下情况除外:
临时绑定到构造函数的 ctor-initializer (12.6.2) 中的引用成员将持续存在,直到构造函数退出。
临时绑定到函数调用 (5.2.2) 中的引用参数将持续存在,直到包含调用的完整表达式完成。
临时绑定到函数返回语句 (6.6.3) 中的返回值的生命周期不会延长;临时在 return 语句中的完整表达式的末尾被销毁。
临时绑定到 new-initializer (5.3.4) 中的引用将持续到包含 new-initializer 的完整表达式完成为止。
并且有一个标准中最后一种情况的例子:
对我来说,2. and 3.
有意义且容易同意。但是bebind的原因是什么1. and 4.
?这个例子对我来说看起来很邪恶。
c++ - 重载 operator-> 当 operator* 返回临时
我有两个具有以下结构的类:
操作符在*
这里可能看起来有点奇怪,但考虑到它的使用上下文实际上是很自然的。事实上,B
真正的存在只是为嵌入式语言提供一些语法糖,因此它的方法和运算符旨在为代码提供所需的外观。给定B b
,获得关联A
的速度很快,*b
。我有时想A
立即调用转换。目前,这需要一些额外的括号(*b).transform()
。似乎有一个自然的简化,即b->transform()
. 但是operator ->
应该返回一个指针并且operator *
返回一个临时的。我怎样才能实现这样的重载?
c++ - 传递给构造函数的临时对象的 C++ 寿命
我有一个在构造函数中接受 istream 引用的类。如果构造函数传递了一个临时对象myclass obj(ifstream("filename"));
,例如 ifstream 对生命有好处obj
吗?它是否取决于它是否分配给类中的引用或指针?
例如:
输出:
仅仅因为输出说文件很好,我不知道它是否被破坏了。如果有部分标准涵盖了这一点,请告诉我。谢谢
c++ - 在临时字符串上使用 string::c_str
关于临时对象何时被销毁,这是否有效:
fopen
在评估了调用的第一个参数之后或之后是否会立即销毁临时对象fopen
。
使用以下代码进行测试:
给出:
这表明首先评估整个语句,然后销毁任何临时对象。这种排序是标准规定的还是特定于实施的?
java - 如何在不创建临时对象的情况下迭代嵌套的 TreeMap
我正在研究 nGram,我正在使用嵌套的 TreeMap 类型的数据结构来存储 ngram。Quadgrams 的模板如下所示。
当我试图将它转储到文件时出现问题,基本上我正在迭代第一个映射的 keySet,然后进入第二个映射的 keymap,依此类推。结果创建了很多临时对象,我得到了 GCOverlimitExceeded 错误。迭代的代码片段如下,
有没有更好的方法来迭代这个列表而不创建临时对象?