我一直在尝试调试崩溃的应用程序崩溃(即断言 *glibc检测到* free():无效指针:0x000000000070f0c0***)而我正在尝试对字符串进行简单的赋值.请注意,我正在使用gcc 4.2.4在Linux系统上进行编译,优化级别设置为-O2.使用-O0,应用程序不再崩溃.
例如
std::string abc;
abc = "testString";
Run Code Online (Sandbox Code Playgroud)
但如果我按如下方式更改了代码,它就不会再崩溃了
std::string abc("testString");
Run Code Online (Sandbox Code Playgroud)
所以我再次挠挠脑袋!但有趣的模式是,崩溃后来在应用程序中移动,AGAIN在另一个字符串.我发现应用程序在字符串赋值上不断崩溃是很奇怪的.典型的崩溃回溯看起来如下:
#0 0x00007f2c2663bfb5 in raise () from /lib64/libc.so.6
(gdb) bt
#0 0x00007f2c2663bfb5 in raise () from /lib64/libc.so.6
#1 0x00007f2c2663dbc3 in abort () from /lib64/libc.so.6
#2 0x00000000004d8cb7 in people_streamingserver_sighandler (signum=6) at src/peoplestreamingserver.cpp:487
#3 <signal handler called>
#4 0x00007f2c2663bfb5 in raise () from /lib64/libc.so.6
#5 0x00007f2c2663dbc3 in abort () from /lib64/libc.so.6
#6 0x00007f2c26680ce0 in ?? () from /lib64/libc.so.6
#7 0x00007f2c270ca7a0 in std::string::assign (this=0x7f2c21bc8d20, __str=<value optimized out>)
at …Run Code Online (Sandbox Code Playgroud) 在标准C++中,我们有char和wchar_t存储字符.char可以存储0x00和0xFF之间的值.并且wchar_t可以在0x0000和之间存储值0xFFFF.std::string使用char,因此它只能存储1个字节的字符.std::wstring使用wchar_t,因此它可以存储最多2个字节宽度的字符.这就是我对C++中字符串的了解.如果到目前为止我说错了,请纠正我.
我在维基百科上阅读了UTF-8的文章,我了解到一些Unicode字符占用的空间最多为4个字节.例如,汉字有一个Unicode代码点0x24B62,它占用内存中的3字节空间.
是否有一个STL字符串容器来处理这些字符?我正在寻找类似的东西std::string32.此外,我们有main()ASCII入口点,wmain()对于具有16位字符支持的入口点; 我们使用3和4字节Unicode支持的代码的入口点是什么?
你能加一个小例子吗?
(我的操作系统:Windows 7 x64)
我在C++中使用Levenshtein Distance算法比较两个字符串来衡量它们彼此之间的距离.然而,普通的Levenshtein距离算法不区分由空格界定的单词边界.这导致距离计算小于我想要的距离.我正在比较标题,看它们彼此有多接近,我希望算法不会将字符计算为匹配,如果它们来自多个单词.
例如,如果我比较这两个字符串,我会得到以下结果,+指定匹配并-指定不匹配:
Al Chertoff Et
Al Church Department of finance Et
+++++------+--++-----++-+------+++
Al Ch e rt of f Et
Run Code Online (Sandbox Code Playgroud)
我得到一个距离为20,在"Chertoff"四个单词中匹配单词,"Church Department of finance"而我真的希望它们被认为是彼此更远的,因为不允许字符与多个单词匹配并且与单词的距离为25 "Chertoff"大多数匹配一个单词"Department",三个字符匹配:
Al Chertoff Et
Al Church Department of finance Et
+++--------+--++---------------+++
Al e rt Et
Ch off
Run Code Online (Sandbox Code Playgroud)
我怎样才能调整Levenshtein距离来实现这个目标,还是有另一种距离算法更适合这个?也许在每个单词上使用Levenshtein距离单独单词工作并选择距离最短的单词?但是,如果将一个单词深深地匹配到字符串中会导致后续单词匹配得不好,因为它们的匹配在字符串中最早?这可能以某种方式完成,Levenshtein距离适应于单词级别吗?
例如,对于以下更复杂的示例,这个想法的最短距离是20:
Al Chertoff Deport Et
Al Church Department of finance Et
+++++----++++-++---------------+++
Al Ch Dep rt Et
ertoff o
Run Code Online (Sandbox Code Playgroud)
而不是最大化"Chertoff"匹配并获得24的更长距离:
Al Chertoff Deport Et
Al …Run Code Online (Sandbox Code Playgroud) 我正在尝试将std::strings放入boost::lockfree::queues中,以便我的线程可以使用新数据相互更新.
当我尝试使用时boost::lockfree::queue<std::string> updated_data;,g++说:
在'class boost :: lockfree :: queue>'的实例化中:
错误:静态断言失败:(boost :: has_trivial_destructor :: value)
错误:静态断言失败:(boost :: has_trivial_assign :: value)
我一般都会看到这些错误意味着什么,但我自己也没有希望自己解决这个问题,因为我几乎是c ++的新手.
有没有另一种方法在线程之间传递文本数据lockfree?如果不是,请告诉我如何把std::string成boost::lockfree::queue.
一个简单的问题:为什么C++ 11没有提供一个"用户 - "(真正的标准库)定义文字用于创建std::string,如
auto str = "hello world"s; // str is a std::string
Run Code Online (Sandbox Code Playgroud)
与C++一样,Objective-C支持C风格的字符串和更加用户友好的库类型NSString; 然而,与C++不同,没有人会在两者之间感到困惑,因为NSString通过为字符串文字添加前缀来创建一个很简单@.事实上,这是难得一见的Objective-C代码,其中一个文本不具有的@前缀.每个人都知道这是做到这一点的方式,使用NSString和继续使用它.
C++ 11用户定义的文字将允许这样做,实际上Stroustrup的C++ 11 FAQ上的UDL部分恰好使用了这个例子.此外,没有前导下划线的UDL是保留的,因此在允许s如上所述的平原上没有问题- 它不可能与其他任何东西发生冲突.
也许我错过了一些东西,但似乎这对语言来说是一个非常有价值且无风险的补充,所以有人知道为什么C++ 11不能提供它吗?它可能出现在C++ 14中吗?
有两个string变量,m和n:
#include <string>
string m = "0100700\0"
cout << m.size() << endl; // it prints: 7
string n;
n += "0100700"
n += '\0';
cout << n.size() << endl; // it prints: 8
Run Code Online (Sandbox Code Playgroud)
我猜两个都有8个字符,但m只有7个字符,n有8个字符.为什么会这样?
我想有一个固定大小的字符串类.理想情况下,接口将匹配std::string新接口永远不会分配新内存的一个区别.对于应该避免分配新内存的应用程序情况,它应该是一个方便的类.大小可以是静态的(在编译时已知).
我认为有两种方法.第一个是围绕char数组实现一个类,然后实现或多或少的所有函数std::string.我还必须实现一些运算符来创建std::string具有给定固定大小字符串的s等.
第二种方法,我甚至不确定是否可能,将继承std::string and覆盖可能改变字符串大小的所有函数.我查看了basic_stringVisual Studio中的标题,它似乎不是虚拟的,所以我想这不是要走的路.
您认为实施此类课程的最佳方法是什么?
string s;
bool b[] = {s=="", s==s.c_str(), s.c_str()==""};
Run Code Online (Sandbox Code Playgroud)
sets
b[] = {true, true, false};
Run Code Online (Sandbox Code Playgroud)
why is b[2] false?
If A==B and A==C, should that not imply B==C?
为什么std::string会有find会员功能而std::vector朋友却没有呢?
使用std::find字符串有什么问题吗?
\0从给定字符串中删除char 的正确方法是什么.
我没有成功:
std::string msg(data); // Data comes from a remote system connected via socket...
msg.erase(std::remove(msg.begin(), msg.end(), '\0'), msg.end());
Run Code Online (Sandbox Code Playgroud)
这给出了编译错误:
error: cannot convert ‘std::__cxx11::basic_string<char>::iterator {aka __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >}’ to ‘const char*’ for argument ‘1’ to ‘int remove(const char*)’
Run Code Online (Sandbox Code Playgroud)
data来自使用套接字的远程系统,并且/0由于源逻辑而在中间包含几段代码.