https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html
我在GCC 5上使用std :: string遇到了崩溃/ valgrind问题.上面的链接提示ABI从GCC 5.x开始发生了变化.libstd ++的新默认ABI是C++ 11/14 ...它与旧的ABI不兼容.有一种方法可以使用define选择较旧的ABI.
我试图了解ABI之间有什么区别,但没有找到详细信息.我想帮助理解:
关于我遇到的问题的更多细节(https://github.com/YasserAsmi/jvar/issues/21)该项目在GCC 4.8和Clang中运行良好.使用GCC,相同的代码拒绝运行:
x_misc(33112,0x7fff728c2000) malloc: *** error for object 0x7fd639c034cc: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6
Run Code Online (Sandbox Code Playgroud)
这是部分Valgrind输出:
==33027== Invalid read of size 1
==33027== at 0x1006F78BA: _platform_memmove$VARIANT$Nehalem (in /usr/lib/system/libsystem_platform.dylib)
==33027== by 0x100009388: jvar::Variant::toString[abi:cxx11]() const (in bin/ex_misc)
==33027== by 0x1000023A7: bugreport() (in bin/ex_misc)
==33027== by 0x1000133B8: main (in bin/ex_misc)
Run Code Online (Sandbox Code Playgroud)
该项目使用std :: string并具有一些自定义内存管理.它正在使用放置新构造函数等进行一些非典型但有效的操作.我试图更好地理解API对哪种代码的影响以及如何修复它 - …
strdata->std::string::~string();
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
error: '~' in destructor name should be after nested name specifier
strdata->std::string::~string();
^
Run Code Online (Sandbox Code Playgroud)
我正在使用cmake项目...我通过brew安装的gcc版本如下:
gcc --version配置: - prefix =/Library/Developer/CommandLineTools/usr --with-gxx-include-dir =/usr/include/c ++/4.2.1 Apple LLVM 7.0.2版(clang-700.1. 81)目标:x86_64-apple-darwin15.2.0线程模型:posix
我找不到在头文件中任何地方定义的~string().我最终改变它如下,这是有效的.现在可以使用我的用例了.
strdata->std::string::~basic_string();
Run Code Online (Sandbox Code Playgroud)
这个原始版本似乎是正确的,并且在Linux和CYGWIN的GCC中完美运行.阻止它在mac上运行的问题是什么?模板?别的什么?
我一直在使用" const ObjArray&"作为ObjArray模板的参数,而没有考虑它.它似乎工作正常,但当我再次阅读它时,它看起来很好.不应该是" const ObjArray<T> &"吗?没有参数可以引用模板名称吗?它是否在下面工作只是因为它被内联声明编译器假设为T?
template <class T>
class ObjArray : public BArray
{
public:
inline ObjArray() :
BArray(sizeof(T), NULL)
{
}
inline ObjArray(const ObjArray& src) :
BArray(sizeof(T), NULL)
{
copyFrom((ObjArray&)src);
}
inline ObjArray(ObjArray& src) :
BArray(sizeof(T), NULL)
{
copyFrom(src);
}
...
};
Run Code Online (Sandbox Code Playgroud) 我为我的 C++ 项目使用自定义 make 文件。我正在为发布版本寻找最推荐的编译标志。我目前正在使用以下内容:
CXXFLAGS += -O3 -Wall -DNDEBUG
我认为以上内容就足够了,但后来我尝试在二进制文件上运行“strip”工具,它大大缩小了大小。看起来二进制文件中仍然有一些非必要的东西。
我知道这是一个广泛的主题,但我正在寻找优化(速度和大小)发布版本的通用设置。我知道默认情况下 gcc 甚至不会丢弃死代码——我想尽快弄清楚如何做到这一点。
作为参考,我的 make 设置是https://github.com/YasserAsmi/buildmk
如何将C#(UWP app)中IBuffer类型的变量复制到字符串?IBuffer本身似乎没有任何方法.它有长度似乎是正确的值.但我无法在调试器中看到该值(表示需要Native调试).以下是课程.我需要获取数据.
public sealed class MagneticStripeReaderTrackData : IMagneticStripeReaderTrackData
{
public IBuffer Data { get; }
Run Code Online (Sandbox Code Playgroud) 我需要从 Win32 应用程序或 powershell 脚本(未经过沙盒处理且具有足够的权限)中找到 Windows 10 UWP 应用程序的应用程序数据文件夹。如果我知道 AUMID,有没有办法找出沙盒应用程序文件的安装位置?