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;
您不必使用new
和delete
自己管理内存,并且您也不受固定数量的元素的限制。
【讨论】:
这就是你没有启用-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<ContBancar> 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