C++设置函数中的崩溃

C++设置函数中的崩溃,c++,string,getter-setter,C++,String,Getter Setter,我有一个由两个不同类实例化的类,如下所示: 我在下面的代码中遇到set_url函数崩溃。无法决定原因 class UrlAction { String url; bool action; public: UrlAction() : action(false) {}; void operator=(const UrlAction &from); inline String get_url() { return url; } i

我有一个由两个不同类实例化的类,如下所示: 我在下面的代码中遇到set_url函数崩溃。无法决定原因

class UrlAction {
    String url;
    bool action;
public:
   UrlAction() : action(false) {};

   void operator=(const UrlAction &from);

   inline String get_url() {
       return url;
   }
   inline void set_url(String from_url) {
       this->url = from_url;
   }
   inline bool get_action() {
       return action;
   }
   inline void set_action(bool act) {
       this->action = act;
   }
};

class A {
public:
    Vector<UrlAction>   _url_act_list;
};
class B {
public:
    Vector<UrlAction>   _url_act_list;
};
foo() {
    A a;
    B b;
    Vector<String> temp_vect;
    temp_vect.push_back("xxxxx.com");
    temp_vect.push_back("yyyyy.com");
    temp_vect.push_back("zzzzz.com");
    temp_vect.push_back("wwwww.com");
    temp_vect.push_back("vvvvv.com");

    for (int i = 0; i < temp_vect.size(); i++) {
        a._url_act_list[i].set_url(temp_vect[i]); //This is the line causing crash
    }
}
我还编写了一个“=”运算符重载程序,用于分配两个UrlAction类型的对象。

当您声明a时,会实例化Vector\u url\u act\u列表,但\u url\u act\u列表的大小最初为0。因此,当您尝试索引到它时,您会得到一个segfault,导致程序崩溃。

当您声明a时,向量url\u act\u列表被实例化,但最初的大小为0。因此,当您尝试索引到它时,您会得到一个segfault,导致程序崩溃。

a.\u url\u act\u列表为空。你可以

或者定义一个接收大小的构造函数,然后使用该大小在a和B中创建向量 或者在访问向量之前,即for循环之前,相应地调整向量大小 或者把元素推回向量 第一个选项可能如下所示:

A::A(size_t size) : { _url_act_list.resize(size) }
B::B(size_t size) : { _url_act_list.resize(size) }
a.resize(temp_vect.size());
for (int i = 0; i < temp_vect.size(); i++) {
    a._url_act_list[i].set_url(temp_vect[i]); //This is the line causing crash
}
for (int i = 0; i < temp_vect.size(); i++) {
    UrlAction url_action;
    url_action->set_url(temp_vect[i]);
    a._url_act_list.push_back(url_action); //This is the line causing crash
}
第二个选项可能如下所示:

A::A(size_t size) : { _url_act_list.resize(size) }
B::B(size_t size) : { _url_act_list.resize(size) }
a.resize(temp_vect.size());
for (int i = 0; i < temp_vect.size(); i++) {
    a._url_act_list[i].set_url(temp_vect[i]); //This is the line causing crash
}
for (int i = 0; i < temp_vect.size(); i++) {
    UrlAction url_action;
    url_action->set_url(temp_vect[i]);
    a._url_act_list.push_back(url_action); //This is the line causing crash
}
第三个选项可能如下所示:

A::A(size_t size) : { _url_act_list.resize(size) }
B::B(size_t size) : { _url_act_list.resize(size) }
a.resize(temp_vect.size());
for (int i = 0; i < temp_vect.size(); i++) {
    a._url_act_list[i].set_url(temp_vect[i]); //This is the line causing crash
}
for (int i = 0; i < temp_vect.size(); i++) {
    UrlAction url_action;
    url_action->set_url(temp_vect[i]);
    a._url_act_list.push_back(url_action); //This is the line causing crash
}
我相信你的代码可能设计得更好。这个名单真的应该公开吗?考虑选项3是否更容易使用URLActionstring的构造函数?有些事情让我有点困扰,尽管这不是问题的一部分。

a.\u url\u act\u列表为空。你可以

或者定义一个接收大小的构造函数,然后使用该大小在a和B中创建向量 或者在访问向量之前,即for循环之前,相应地调整向量大小 或者把元素推回向量 第一个选项可能如下所示:

A::A(size_t size) : { _url_act_list.resize(size) }
B::B(size_t size) : { _url_act_list.resize(size) }
a.resize(temp_vect.size());
for (int i = 0; i < temp_vect.size(); i++) {
    a._url_act_list[i].set_url(temp_vect[i]); //This is the line causing crash
}
for (int i = 0; i < temp_vect.size(); i++) {
    UrlAction url_action;
    url_action->set_url(temp_vect[i]);
    a._url_act_list.push_back(url_action); //This is the line causing crash
}
第二个选项可能如下所示:

A::A(size_t size) : { _url_act_list.resize(size) }
B::B(size_t size) : { _url_act_list.resize(size) }
a.resize(temp_vect.size());
for (int i = 0; i < temp_vect.size(); i++) {
    a._url_act_list[i].set_url(temp_vect[i]); //This is the line causing crash
}
for (int i = 0; i < temp_vect.size(); i++) {
    UrlAction url_action;
    url_action->set_url(temp_vect[i]);
    a._url_act_list.push_back(url_action); //This is the line causing crash
}
第三个选项可能如下所示:

A::A(size_t size) : { _url_act_list.resize(size) }
B::B(size_t size) : { _url_act_list.resize(size) }
a.resize(temp_vect.size());
for (int i = 0; i < temp_vect.size(); i++) {
    a._url_act_list[i].set_url(temp_vect[i]); //This is the line causing crash
}
for (int i = 0; i < temp_vect.size(); i++) {
    UrlAction url_action;
    url_action->set_url(temp_vect[i]);
    a._url_act_list.push_back(url_action); //This is the line causing crash
}
我相信你的代码可能设计得更好。这个名单真的应该公开吗?考虑选项3是否更容易使用URLActionstring的构造函数?虽然这不是问题的一部分,但还是有一些问题困扰着我。

a.\u url\u act\u列表在您试图呼叫操作员[]时是空的。考虑更换

a._url_act_list[i].set_url(temp_vect[i]); //This is the line causing crash

a、 当您尝试呼叫操作员[]时,url\u act\u列表为空。考虑更换

a._url_act_list[i].set_url(temp_vect[i]); //This is the line causing crash


您正在访问超出范围的_url_act_列表。此外,当使用字符串和向量的非标准版本时,最好至少包含信息,它们来自何处。什么是向量?什么是弦?C++有STD::vector和STD::string,那么这些版本是从大写字母开始的?为了开始解决这些问题,可以将CUT语句添加到代码中查看变量的值,看看它们是否符合您的期望。这里使用的字符串和向量STL是自定义的和非标准的。您访问的是超出范围的_url_act_列表。此外,当使用字符串和向量的非标准版本时,最好至少包括它们来自何处的信息。什么是向量?什么是弦?C++有STD::vector和STD::string,那么这些版本是从大写字母开始的?为了开始解决这些问题,你可以将CUT语句添加到代码中查看变量的值,看看它们是否是你所期望的。是的,这里使用的字符串和向量STL是自定义的和非STD的。但在OP发布他们的向量类之前很难说清楚。可能是对的,但在OP发布他们的向量类之前很难说清楚///被推的是什么///推什么?谢谢。从_url,bool act添加了一个构造函数UrlActionString,用于在创建对象并将其推入向量a时设置url和操作_谢谢你。从_url,bool act添加了一个构造函数UrlActionString,用于在创建对象并将其推入向量a时设置url和操作_url\u act\u列表