问题标签 [g++4.8]

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.

0 投票
1 回答
165 浏览

c++ - 程序自行删除,无法启动

我正在开发一个实现引用计数系统的库。在调试模式下,我打印出何时分配和删除值。编译测试程序并运行后,它并没有真正运行,而是实际上删除了自己并留下了一个stackdump文件。有趣的是,这只发生在我使用一个像基于范围的引用管理器一样实现的小型帮助模板类时(当对象帮助对象被销毁时减少引用计数)。

甚至 GDB 都无法帮助我,因为当我指示它运行时main.exe,它说它无法打开进程。

描述

因此,首先,我查看了导致所描述行为的主程序。

将其更改为以下内容会使程序再次运行:

但我知道Handle<T>该类实际上运行良好,因为以下函数再次运行良好,没有问题或未释放的值。(@agbinfo)String该类是Value. 该Handle模板旨在与该类一起使用,因此当不再需要该值时Value无需手动调用。Value::Decref()

有趣的是,当我替换return a.Release();intest2()return nullptr;invoke test1()but never ever test2()时,程序再次运行良好。

我恢复到程序崩溃的状态,并试图在代码更深的地方找到问题。我查看了vv::Value创建或删除对象时完成的日志记录。从中删除utils::typestr(Type())零件vv::Value::Free()会使程序再次运行!

现在,在 中vv::utils::typestr(),我通过将其字节解释为字符来将整数转换为字符串,因为可以从中返回的值vv::Value::Type()被声明为

所以代码typestr()

堆栈转储

对于stackdump,不幸的是它不是每次都生成的,我现在无法重现它以获得最近的stackdump。但是其中一个生成的文件看起来很像这样:

编译输出

海合会详细信息

Windows 7 64 位上的 Cygwin


到目前为止,这似乎使程序运行。但是你知道这个问题可能来自哪里吗?就我而言,我无法在typestr(). 也许作为经验丰富的开发人员,您可以识别并告诉我一些模式?

0 投票
1 回答
2406 浏览

c++ - 在 Cygwin 中编译:'EOF' 未在此范围内声明,在 CentOS 中编译良好

我在 Cygwin 中编译 Linux 绑定应用程序时遇到问题。

这个错误:

由以下代码片段生成

在 CentOS 中直接编译不会产生错误。

这些是 make 文件传递​​的 g++ 参数:

centOS 上的 GCC 版本:

Cygwin 中的 GCC 版本

我想知道我是否只是缺少 Cygwin 中的一些库,或者这只是 Cygwin 的限制并且无法解决。

0 投票
1 回答
1531 浏览

c++ - 从删除了复制构造函数的类继承

我的类base只包含私有默认构造函数和公共删除的复制构造函数,没有别的。

如果我尝试继承base并创建derived如下类的实例,g++ 4.8.2 不会编译我的代码,但 VC++ 2013 会。

那么,它是 g++ 或 VC++ 2013 中的一个错误,只是忽略了一些东西吗?

这是完整的代码...

...和 ​​g++ 错误消息。

0 投票
2 回答
173 浏览

c++ - atof 随机无法正常工作

我似乎在atof()函数没有正确转换某些值时遇到了一些奇怪的问题。对于相同的值,atoi()可以完美运行。
这是我正在做的一个小片段:

出于某种奇怪的原因,只有方法#2 似乎总是能正常工作。

样本输出

FOR:频率=“a30b30c40”

两种方法都可以正常工作,给我:
a - 0.30
b - 0.30
c - 0.40

FOR:频率=“a10b10c10d10e10f50”

使用atof()我得到:
a - 0.10
b - 0.10
c - 1000000000.00 !?
d - 1000000000.00 !?
e - 0.10
f - 0.50
atoi() 正确地给了我这个:
a - 0.10
b - 0.10
c - 0.10
d - 0.10
e - 0.10
f - 0.50

ps 我不能使用 std::stod 因为 mingw...

0 投票
3 回答
1382 浏览

c++ - 当一个 C++ lambda 表达式有大量的引用捕获时,未命名函数对象的大小会变大

以下代码:

输出 56 用g++ 4.8.2编译

由于所有局部变量都存储在同一个堆栈帧中,因此记住一个指针就足以定位所有局部变量的地址。为什么 lambda 表达式会构造一个这么大的未命名函数对象?

0 投票
2 回答
143 浏览

c++ - 乱序执行

g++ 4.8.2 (cygwin)

testMarkListIO() 语句在 testListIO() 语句之前执行。这有什么原因吗?

0 投票
1 回答
402 浏览

c++ - libstdc++ 是否实现 C++11 双端队列接口?

我对 GCC 和 libstdc++ 的经验很少。尝试在 C++11 中编译一个非常简单的程序,我发现编译器错误看起来 STL 没有为双端队列实现新的 C++11 接口。

示例程序:

运行以下命令行,我在注释行中得到编译错误:

(安装的 gcc/libstdc++ 版本为 4.8.1)

看起来 STL 没有实现:

http://en.cppreference.com/w/cpp/container/deque/insert,或标准 C+11 23.3.3.4 deque 修饰符)

我知道 libstdc++ 还没有完全实现 C++11,但状态页面(http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2011)仅建议分配器和传播要求还没有完成。

所以我的问题:

  • 实际上 libstdc++ 中没有完整的 C++std::deque接口实现,还是我遗漏了什么?(也许我没有使用正确的库版本,或者我在命令行中缺少一些参数;我对 gcc/g++ 没有太多经验)。
  • 如果这是我的错误,我该如何解决?
0 投票
1 回答
279 浏览

c++ - 最小程序会在 g++ 上产生 Valgrind 警告,但不会发出 clang 或 VS

我一直在疯狂地追踪一个中型项目中的内存错误。我将一个最小化为以下代码,并验证这会导致 Valgrind 在注释行号处发出无效读取警告。我在项目中使用 g++ 4.8.2 (Debian 4.8.2-16),使用 -std=c++11 -O0 编译。g++ 4.7.0 也会产生错误,4.4.6 在稍微修改的版本上也会产生错误(删除 C++11)。clang++ 不会导致错误,VS2013 也不会。

我的问题是:

  1. 我是否在不知不觉中参与了未定义的行为?

  2. 这是 Valgrind 的误报吗?如果是这样,我怎样才能让自己对未来的这种/情况感到放心?

这段代码相当脆弱——特别是,让 foo 通过引用获取坐标消除了这个问题,就像为 Coord 选择更大的类型以使其在内存中的大小大于 8 字节一样。

Valgrind 输出:

0 投票
1 回答
377 浏览

c++ - 标准库 (limits.h) 的 g++ 错误

我试图从http://openbiometrics.org/doxygen/latest/installation.html安装 OpenBR ,但标准 c 库出现错误。

我所知道的是 numeric_limits 是标准的 c++ 库。而且这样的错误不应该存在。请解释为什么会出现这个问题。

我的 g++ 版本是 4.9.0。我还尝试了 4.8 和 4.7 版本。

0 投票
2 回答
468 浏览

c++ - 在调用 C++/STL 算法时消除不必要的副本

  • 为了更好地说明我的问题,我编写了以下示例。

  • 在下面的代码中,我介绍了一个函数对象(即funObj)。

  • funObj类的定义id中,定义了一个完整的成员变量来保存每个成员的 IDfunObj构造的 ID,并定义一个静态整数成员变量n来计算funObj创建的对象。

  • 因此,每次funObj构造对象时n都会增加 1,并将其值分配给id新创建的字段funObj

  • 此外,我还定义了一个默认构造函数、一个复制构造函数和一个析构函数。三人都在向stdout以表示他们的调用以及funObj他们所指的 ID。

  • 我还定义了一个函数,该函数func将类型的值对象作为输入funObj

代码:

输出:

打电话func...

通过默认构造函数构造,对象 foo 具有 ID(1)

销毁 ID(1) 的对象 foo

打电话for_each...

通过默认构造函数构造,对象 foo 具有 ID(2)

通过复制构造函数构造,对象 foo 具有 ID(3)

销毁 ID(2) 的对象 foo

销毁 ID(3) 的对象 foo

打电话generate...

通过默认构造函数构造,对象 foo 具有 ID(4)

通过复制构造函数构造,对象 foo 具有 ID(5)

销毁 ID(5) 的对象 foo

已销毁 ID(4) 的对象 foo

使用std::ref...

通过默认构造函数构造,对象 foo 具有 ID(6)

for_eachref...通话

generateref...通话

销毁 ID(6) 的对象 foo

讨论:

正如您从上面的输出中看到的那样,func使用临时类型的对象调用函数funObj会导致构造单个funObj对象(即使func按值传递其参数)。然而,当将临时对象类型传递funObj给 STL 算法std::for_eachstd::generate. 在前一种情况下,复制构造函数被调用并funObj构造了一个额外的。在相当多的应用程序中,创建这种“不必要的”副本会显着降低算法的性能。基于这一事实,提出了以下问题。

问题:

  1. 我知道大多数 STL 算法通过值传递它们的参数。然而,相比func同样按值传递其输入参数的 相比,STL 算法会生成一个额外的副本。这个“不必要的”副本的原因是什么?
  2. 有没有办法消除这种“不必要的”副本?
  3. 调用时std::for_each(std::begin(v), std::end(v), funObj<int>())func(funObj<int>())临时对象funObj<int>分别位于哪个范围内?
  4. 我已经尝试使用std::ref以强制通过引用传递,并且您可以看到“不必要的”副本已被消除。但是,当我尝试将临时对象传递给std::ref(即std::ref(funObj<int>()))时,会出现编译器错误。为什么这样的陈述是非法的?
  5. 输出是使用 VC++2013 生成的。如您所见,调用时出现异常std::for_each正如您所看到的,当调用对象的析构函数时,以相反的顺序调用对象为什么呢?
  6. 当我在运行 GCC v4.8 的Colirustd::generate上运行代码时,析构函数的异常已修复,但不会生成额外的副本。为什么呢?

详细信息/评论:

  • 上面的输出是从 VC++2013 生成的。

更新:

  • 我还在funObj类中添加了一个移动构造函数(参见下面的代码)。


  • 我还在 VC++2013 中开启了全面优化,并在发布模式下编译。

输出(VC++2013):

打电话func...

通过默认构造函数构造,对象 foo 具有 ID(1)

销毁 ID(1) 的对象 foo

打电话for_each...

通过默认构造函数构造,对象 foo 具有 ID(2)

通过移动构造函数构造,对象 foo 具有 ID(2)

销毁 ID(2) 的对象 foo

已销毁 ID(0) 的对象 foo

打电话generate...

通过默认构造函数构造,对象 foo 具有 ID(3)

通过复制构造函数构造,对象 foo 具有 ID(4)

已销毁 ID(4) 的对象 foo

销毁 ID(3) 的对象 foo

使用std::ref...

通过默认构造函数构造,对象 foo 具有 ID(5)

for_eachref...通话

generateref...通话

销毁 ID(5) 的对象 foo

输出 GCC 4.8

打电话func...

通过默认构造函数构造,对象 foo 具有 ID(1)

销毁 ID(1) 的对象 foo

打电话for_each...

通过默认构造函数构造,对象 foo 具有 ID(2)

通过移动构造函数构造,对象 foo 具有 ID(2)

销毁 ID(2) 的对象 foo

已销毁 ID(0) 的对象 foo

打电话generate...

通过默认构造函数构造,对象 foo 具有 ID(3)

销毁 ID(3) 的对象 foo

通过默认构造函数构造,对象 foo 具有 ID(4)

for_eachref...通话

generateref...通话

已销毁 ID(4) 的对象 foo

std::generate如果优化标志打开并且编译处于发布模式,并且除了定义了移动构造函数的事实,VC++2013 似乎会生成额外的副本。