我需要使用一个函数(dpdk提供的eal_setup
),它接受argc
和argv
作为参数,并且应该在main
函数中首先调用,直接从应用程序的调用中获取argc
和argv
。
然而,由于其他原因,应用程序需要能够接受参数,并且eal_setup
的一些参数我永远不需要从我设置的默认值更改。这就需要手动构造一个“假”argv
,我的意思是一个char**
类型变量,它包含我想要传递到eal_setup
的任何信息。
所以,我最终要做的是,在用CLI11
处理了真实的的argc
和argv
之后,我构造了一个std::vector<std::string>
,我通过一个函数将字符串向量中的信息转换为char**
,然后将其与eal_setup
一起使用。
我创建的函数不能工作,它可以编译,但是每当我试图以与argv
相同的方式访问结果的元素时,我都会得到一个分段错误。
char** construct_argv(std::vector<std::string> std_argv){
std::vector<char*> vec_argv;
for (std::string str_arg : std_argv){
vec_argv.insert(vec_argv.begin(), (char*)str_arg.c_str());
}
return vec_argv.data();
}
如何正确地将std::vector<std::string>
转换为char**
,以创建模拟argv
?
1条答案
按热度按时间m2xkgtsf1#
std_argv
是这个函数的一个参数。函数参数就像局部变量。当函数返回时,所有局部变量都被销毁。它们不再存在。它们不再存在。它们开始渴望峡湾。它们成为ex-object。你的
construct_argv
仔细地构造了一个指向每个指针的向量,并返回它:但是,当然,你得到了双倍的头痛作为你的奖励。
vec_argv
是另一个本地对象。它返回一个指向向量内部数据的指针。向量立即被销毁,因为这个函数返回。你留下了一个完全空的袋子,装满了指向被销毁对象的指针,它本身也被销毁了。整个函数必须从头开始重新设计。有很多不同的方法可以正确地做到这一点。一种方法是通过引用传递
std_argv
,让调用者负责不让原始std::vector<std::string>
超出范围并被销毁。然后返回vec_argv
本身,让调用者负责获取其data()
。因为C++11
std::string
的data()
保证是空终止的,所以这也可以是str_arg.data()
。