gpt4 book ai didi

c++ - std::vector 的内容消失

转载 作者:行者123 更新时间:2023-11-28 03:34:54 26 4
gpt4 key购买 nike

我有一个字符串 vector ,它正在无缘无故地改变它的内容。无法真正解释发生了什么。抱歉列出的内容很长,但这真的让我很烦。

我有一个 GUI 应用程序,它加载一些文件并使用一个阅读器对象,该对象的状态可以通过使用 parse(int argc, char* argv[]) 来设置。方法。通过选中各种框并输入值在对话框中设置参数。这是我用来保存对话框数据的结构:

struct PointFilter
{
PointFilter(): argc(0) {};
~PointFilter() {};
int argc;
std::vector<std::string> args;
};

此结构是对话框类的成员,在按下确定按钮后,它会填充适当的值。这些值从对话框的文本框中获取到字符串流中,然后推回到 std::vector:

class AdvancedLoadDialog
{
public:
AdvancedLoadDialog(const Glib::RefPtr<Gtk::Builder>&);
~AdvancedLoadDialog();

PointFilter get_point_filter()
{
return this->point_filter;
}

private:
PointFilter point_filter;
void on_ok_btn_clicked();

void AdvancedLoadDialog::on_ok_btn_clicked()
{
std::stringstream filter_stream;
// filter_stream << some_values_from_textboxes ...

std::vector<std::string> args;
std::string arg;

// we need a dummy first argument to emulate the command line
args.push_back("filter");

while (filter_stream >> arg)
{
args.push_back(arg);
}

point_filter.argc = args.size() > 1 ? args.size() : 0;
point_filter.args = args;

advanced_load_dialog->hide_all();
}

到目前为止一切正常,我们有一个 AdvancedLoadDialog对象 point_filter持有我们论点的成员。现在在一个单独的窗口中,我获取 point_filter 对象并将其传递给 LoadWorker 的构造函数类,它加载文件并且还有一个 PointFilter成员(member)。

load_worker = new LoadWorker(..., advanced_load_dialog->get_point_filter())

然后:

LoadWorker::LoadWorker(..., PointFilter pf) :
point_filter (pf)

一切都很好。现在在 LoadWorker::run()函数 我从 point_filter 中获取参数,将它们转换为 std::vector 并将它们传递给我需要的 `parse(int argc, char* argv[]) 函数。

void LoadWorker::run()
{
std::cout << "LoadWorker::file_filter contents: \n"
<< "point_filter.argc: " << point_filter.argc << "\n"
<< "point_filter.args: " << std::endl;
for (int i = 0; i < point_filter.argc; ++i)
std::cout << point_filter.args[i] << std::endl;

// ...

if (point_filter.argc != 0)
{
std::cout << "Using filter: " << std::endl;

std::vector<char*> argv;

for (std::vector<std::string>::const_iterator it = point_filter.args.begin();
it != point_filter.args.end(); ++it)
{
argv.push_back(const_cast<char*>(it->c_str()));
}
argv.push_back(0);

for (int i = 0; i < point_filter.argc; ++i)
{
std::cout << argv[i] << std::endl;
}

if (!lasreadopener.parse(point_filter.argc, &argv[0]))
{
send_message("Error parsing filter parameters.");
sig_fail();
return;
}
}
}

现在这个工作...一次。您会注意到参数被打印了两次,第一次是作为 LoadWorker::point_filter.args 的元素。 vector ,然后作为 vector<char*> argv 的元素.如果我设置过滤器然后按下加载按钮,一切正常。如果我然后尝试加载另一个文件,而不更改 AdvancedLoadDialog::point_filter根本上,争论正在消失。这是一个尝试连续加载两个文件的示例输出。

LoadWorker::file_filter contents: point_filter.argc: 6 point_filter.args: filter -clip_z_above 12 -keep_intensity 11 222 Using filter: filter -clip_z_above 12 -keep_intensity 11 222 LoadWorker::file_filter contents: point_filter.argc: 6 point_filter.args: filter clip_z_above 2 keep_intensity 1 22 Using filter: filter

// 6 blank lines here

更奇怪的是,在第二次运行期间,除了 point_filter.args 中的第一个字符串之外的每个字符串缺少第一个字符并且在 argv 中它们都是空的。

有什么线索吗?

最佳答案

在处理涉及 std::string::c_str 的事情时要非常非常谨慎,就像您在这里所做的那样:

argv.push_back(const_cast<char*>(it->c_str()));

如果你想保留c_str提供的值,你应该先将它们复制到一个新的容器中。

如果cplusplus.com是值得信任的(情况并非总是如此),

the values in this array should not be modified in the program and are only guaranteed to remain unchanged until the next call to a non-constant member function of the string object

虽然我无法立即从其他来源获得任何更有用的信息。

关于c++ - std::vector<std::string> 的内容消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11225886/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com