c ++访问冲突写入位置0x00000000

Posted

技术标签:

【中文标题】c ++访问冲突写入位置0x00000000【英文标题】:c++ Access violation writing location 0x00000000 【发布时间】:2014-10-26 10:12:22 【问题描述】:

我有以下代码: 在 Client.cpp 中有一个构造函数正在为 ContBancar 类型的数组“conturi”分配内存。

Client::Client(string nume, string prenume, string adresa)

    this->nume = nume;
    this->prenume = prenume;
    this->adresa = adresa;
    nrCont = 0;
    ContBancar** conturi = new ContBancar*[50]; 

然后有一个方法是在“conturi”数组中添加一个账户:

void Client::adaugaCont(ContBancar* contNou)

    conturi[nrCont++] = contNou;

这是我在 Main.cpp 中的代码:

ContBancar ron1 ("1.r", 0, Banca::RON);
Client ioana ("Pop", "Ioana", "Str Dorobantilor 3/4");
ioana.adaugaCont(&ron1);

但它在运行时给了我访问冲突错误,就像数组'conturi'没有分配内存。我不明白为什么,因为内存应该在构造函数中分配。

谁能帮我解决这个问题?

【问题讨论】:

ContBancar** conturi = new ContBancar*[50]; 改成conturi = new ContBancar*[50]; 然后将任何 new[]s 更改为 std::vector 构造函数调用。 ***.com/questions/16150543/… 的副本 【参考方案1】:
Client::Client(string nume, string prenume, string adresa)

    this->nume = nume;
    this->prenume = prenume;
    this->adresa = adresa;
    nrCont = 0;
    //here is your problem!
    ContBancar** conturi = new ContBancar*[50]; 

您将 conturi 重新定义为一个新数组,并将指向它的指针存储在构造函数的本地范围内。

将行改为:

conturi = new ContBancar*[50]; 

然后您将让对象的 conturi 指针指向分配的内存。 这也将解决您介绍的内存泄漏。 (指向堆的指针超出范围。堆上的内存泄漏)

或者更好的是,使用 std::vector。 在类定义中:

std::vector<ContBancar> conturi;

您不必使用newdelete 自己管理内存,并且您也不受固定数量的元素的限制。

【讨论】:

这就是你没有启用-Wall -Wextra -Werror的结果。 @right 你是什么意思?这是否意味着对这个问题的补充?【参考方案2】:

您正在使用以下行声明一个新的指针变量:

ContBancar** conturi = new ContBancar*[50]; 

并且指针变量将在函数调用结束时被销毁并泄漏内存,而其他任何同名成员变量都不会受到影响。

您应该使用成员变量conturi(假设您在其余代码中有一个):

Client::Client(string nume, string prenume, string adresa)

    this->nume = nume;
    this->prenume = prenume;
    this->adresa = adresa;
    nrCont = 0;
    conturi = new ContBancar*[50];

或者您可以使用std::vector&lt;ContBancar&gt; conturi 成员变量,它可能更易于使用和处理。

这是一个简单的复制器,可以更好地理解问题:

class Client 
public:
    int** conturi = 0;

    void function() 
        int** conturi = new int*[50];
    
;

int main()

    Client obj;
    obj.function();
    if(obj.conturi == 0)
       std::cout << "this is still zero"; // This will get printed

Example

【讨论】:

会在函数调用结束时被销毁, ?实际上它只会泄漏内存并且不会影响成员变量conturi 当然,变量会被销毁,虽然它会泄漏内存。我没有写它是安全的。我会说清楚的。

以上是关于c ++访问冲突写入位置0x00000000的主要内容,如果未能解决你的问题,请参考以下文章

C++:0xC0000005:访问冲突写入位置0x00000000

IXAudio2 - 0xC0000005:访问冲突写入位置 0x00000000

写入位置0x00460000时发生访问冲突,这是啥原因?

0xC0000005: 写入位置 0x00000000 时发生访问冲突的解决办法(转)

opencv中的访问冲突写入位置

为啥在内存位置写入访问冲突[重复]