访问违例新C++结构

访问违例新C++结构,c++,struct,visual-studio-2017,new-operator,access-violation,C++,Struct,Visual Studio 2017,New Operator,Access Violation,我有这个结构: struct event_ { bool is_crossover = false; bool is_birth = false; bool is_repetitive = false; int eID = 0; bool inicio_fin = false; fecha inicio_fecha; fecha fin_fecha; locacion inicio_l; string eLatit

我有这个结构:

struct event_ {

    bool is_crossover = false;
    bool is_birth = false;
    bool is_repetitive = false;

    int eID = 0;

    bool inicio_fin = false; 
    fecha inicio_fecha;
    fecha fin_fecha;

    locacion inicio_l;
    string eLatitud_i = 0; 
    string eLongitud_i = 0;

    locacion fin_l;
    string eLatitud_f = 0;
    string eLongitud_f = 0;

    personaje_info personajes_evento; //This is a class
    int cantidad_personajes = 0;

    string nombre;
    string descripcion;
    string tipo_evento;

    event_ *sig, *ant;
};
然后,当我调用函数时:

event_ *n = new event_;
它向我发送访问冲突错误:

Exception thrown at 0x0F69F6E0 (ucrtbased.dll) in Auxiliar Libros.exe: 0xC0000005: Access violation reading location 0x00000000.
有人知道为什么会这样吗? 作为补充信息,我运行了代码度量分析,在此之前,程序运行得非常好。它还告诉我关于异常,我应该怎么做?

这段代码

string eLongitud_f = 0;
使用空指针0调用字符串构造函数是写入空指针的另一种方式,会导致访问验证错误

你认为代码在做什么?显然,0是一个整数而不是字符串。你是说这个吗

string eLongitud_f = "0";
string eLongitud_f = "";
或者你是这个意思

string eLongitud_f = "0";
string eLongitud_f = "";
也许你是这个意思

double eLongitud_f = 0.0;
你也可以只吃这个

string eLongitud_f;

这与上面的第二个备选方案相同。所有这些都是可能的,很难知道您真正想要的是哪一个,但根本的问题是您有一个字符串变量,并且试图给它一个不是字符串的值。

要解决您的问题,我认为最好的办法是减少代码并尝试一些组合

首先,您必须尝试一个只有一个bool变量的小struct,以查看新函数是否正确

struct event_
    {
    bool is_crossover = false;
    };

event_ *n = new event_;
如果你的程序继续崩溃,你的错误就在那里,以新的形式出现

否则你可以试着减少你的结构,去掉你认为正确的东西

我个人认为你所有的bool,int和event_uu声明都是正确的,所以我删除了它们。 我认为类似的对象声明也可以删除,我将删除它们

我的结构如下:

struct event_
    {
    fecha fin_fecha;
    locacion inicio_l;
    string eLatitud_i = 0; 
    personaje_info personajes_evento;
    };
构建和运行此代码时会发生什么

如果您的程序已停止崩溃,那么错误是否在已删除的代码中

否则,此新结构的一个或多个声明行不正确

如果更改结构对代码的影响太大,您可以创建一个类似的结构(其他名称尚未使用),然后对其进行测试

拜托,你能试试吗?我想你会发现自己很快就能解决问题


您的第一个代码中有太多的变量会导致崩溃?

Hmm。。。字符串长度f=0;正在给我gcc上的逻辑错误。访问冲突读取位置0x00000000表示您试图在某处取消引用空指针。event_*n=新事件;除非您重载了新运算符,否则不应导致此问题。实际上,您的personaje_info类的构造函数可能正在尝试取消对空指针的引用,因此这将是一个检查替换所有字符串xxx=0的位置;使用字符串xxx@铃木:欢迎来到StackOveflow。这真是一个很棒的问答网站。我对你的问题有点意见。从1986起,我是C++程序员,当遇到同样的问题时,代码受到的影响很短。我不直接联系你。我首先尝试减少我的代码。在评论中这样做并不容易,所以我会提出一个答案,这个答案不是答案,只是找到答案的一种方式。哦,哇!我甚至不知道对于std::string的赋值运算符,整数将隐式转换为const char指针。我只是假设他们用它作为那些字符串的占位符。还是将其转换为角色?@JeffreyCash这只发生在整数零上。任何其他整数都将是编译器错误。这是一个不幸的遗产,现代C++对于空指针有null pTR,但是零仍然代表空指针。谢谢,我甚至没有注意到这个…它现在正在工作c: