我有一个std :: string包含一个用execv执行的命令,什么是最好的"C++"方法将它转换为execv()的第二个参数所需的"char*argv []"?
澄清:
std::string cmd = "mycommand arg1 arg2";
char *cmd_argv[];
StrToArgv(cmd, cmd_argv); // how do I write this function?
execv(cmd_argv[0], cmd_argv);
Run Code Online (Sandbox Code Playgroud) 假设你有一个全局的类(例如可用于应用程序的运行时)
class MyClass {
protected:
std::string m_Value;
public:
MyClass () : m_Value("hello") {}
std::string value() { return m_Value; }
};
MyClass v1;
Run Code Online (Sandbox Code Playgroud)
当我这样做时,使用第一种形式给了我奇怪的行为
printf("value: %s\n", v1.value().c_str());
Run Code Online (Sandbox Code Playgroud)
看起来字符串在printf可以使用之前从内存中消失了.有时它打印值:hello其他时候它崩溃或什么都不打印.
如果我第一次复制字符串就像这样
std::string copiedString = v1.value();
printf("value: %s\n", copiedString.c_str());
Run Code Online (Sandbox Code Playgroud)
事情确实有效.
当然必须有一种方法可以避免使用临时字符串.
编辑:所以共识是使用const std :: string和返回值.
我知道每个人都说原始代码应该没问题,但我可以告诉你,我在Windows CE上看到MSVC 2005遇到了麻烦,但只能在CE盒子上.不是Win32交叉编译.
我在使用""(即空字符串)初始化std :: string变量时遇到问题.它导致以前工作的代码中的奇怪行为.以下陈述是错误的吗?
std::string operationalReason = "";
Run Code Online (Sandbox Code Playgroud)
当我使用以下代码时一切正常:
std::string operationalReason;
operationalReason.clear();
Run Code Online (Sandbox Code Playgroud)
我相信字符串文字存储在一个独立于编译器的内存位置.我看到的问题实际上是否表明存储器已损坏?如果是这样,我将使用该clear() 函数隐藏它.
谢谢.
当我std::string使用默认构造函数创建一个时,是否在堆上分配了任何内存?我希望答案不依赖于实施,并且是标准化的.考虑以下:
std::string myString;
Run Code Online (Sandbox Code Playgroud) 是否可以将std :: string用于read()?
示例:
std::string data;
read(fd, data, 42);
Run Code Online (Sandbox Code Playgroud)
Normaly,我们必须使用char*但是可以直接使用std :: string吗?(我更喜欢不创建char*来存储结果)
谢谢
我必须检查特定字符串是否以另一个字符串开头.字符串使用utf8编码,比较应不区分大小写.
我知道这与C++中的Case不敏感字符串比较非常相似,但我不想使用boost库,我更喜欢可移植解决方案(如果它"几乎'不可能,我更喜欢面向Linux的解决方案).
在C++ 11中使用其regexp库是否可行?或者只使用简单的字符串比较方法?
我必须处理一种文件格式(包括读取和写入),其中字符串以UTF-16编码(每个字符2个字节).由于ASCII表中的字符很少在应用程序域中使用,因此我的C++模型类中的所有字符串都存储在std :: string(UTF-8编码)的实例中.
我正在寻找一个库(在STL和Boost中搜索没有运气)或一组C/C++函数来处理这个std :: string < - > UTF-16转换从加载或保存到文件格式时(实际建模)作为一个字节流)包括代理对的生成/识别和所有那些Unicode的东西(我承认不是专家)...
有什么建议?谢谢!
编辑:忘了提它应该跨平台(Win/Mac),不能使用C++ 11.
我有构造一个函数std::string从一个const char*与两个数字,作为参数传递,追加到它的结束.
std::string makeName(const char* name, uint16_t num1, uint16_t num2) {
std::string new_name(name);
new_name.reserve(new_name.length()+5);
new_name += ":";
new_name += boost::lexical_cast<std::string>(num1);
new_name += ":";
new_name += boost::lexical_cast<std::string>(num2);
return new_name;
}
Run Code Online (Sandbox Code Playgroud)
该函数被调用数千次,以便为堆上分配的小对象创建唯一的名称.
Object* object1= new Object(makeName("Object", i, j)); // i and j are simply loop indices
Run Code Online (Sandbox Code Playgroud)
我发现使用valgrind的massif工具调用makeName会分配大量内存,因为它被调用了很多次.
87.96% (1,628,746,377B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc.
->29.61% (548,226,178B) 0xAE383B7: std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
| ->26.39% (488,635,166B) 0xAE38F79: std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
| | …Run Code Online (Sandbox Code Playgroud) 所以,operator[]不直接说s[s.size()]必须是s[s.size()-1]内存之后的人物.似乎措辞是为了避免提出这种说法.
但是s.data()说s.data()+k == &s[k],并且s.data()必须返回一个指针.
忽略&在CharT上面使用而不是上面使用的看似标准缺陷,std::addressof实现CharT是否s[s.size()]可以在第一次调用之前自由地返回不同的(例如,在受保护的页面上,或在ROM中)s.data()?(显然,它可以将缓冲区安排在一个只读的页面上结束;我说的是另一种情况)
要明确:
据我所知,如果s.data()永远不会被调用(并且编译器可以证明它),那么s[s.size()]就不需要与缓冲区的其余部分连续.
可以在调用之后进行std::addressof(s[s.size()]) 更改,s.data()并且实现符合标准(只要之前s.data()+k == &s[k]已经过.data()评估[],但编译器可以自由执行).或者是否有我看不到的不变性要求?
贾斯汀对另一个问题的回答使得我觉得非常有趣,但无法解释.请考虑以下代码:
std::vector<std::string> v;
v.push_back("Hello, world!"); // Doesn't call strlen.
v.emplace_back("Hello, world!"); // Calls strlen.
Run Code Online (Sandbox Code Playgroud)
如果查看程序集,则emplace_back生成一个调用strlen,而push_back不是(在gcc 8.1和clang 6.0中使用测试-Ofast).
为什么会这样?为什么不能emplace_back在strlen这里优化呼叫?我最初的想法是在函数调用之前push_back隐式创建(因此构造函数直接传递字符串文字,这是最佳处理),而在函数调用之后创建(因此构造函数转发字符串文字,我推测已经从a衰减到a ,因此需要打电话).std::string std::stringemplace_backstd::string std::stringconst char [N]const char *strlen
但是emplace_back需要一个T&&参数,和我的测试显示,字符串文字不应该在这里腐烂的指针.显然,我忽略了一些东西.