You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
dotnet-learn-vs/WebMVC/WebMVCApi/md/c++ 不规范初始化时,出现的一系列奇怪问题解决(引发...

3.2 KiB

icon date category tag headerDepth
edit 2023-01-06
cpp
初始化问题
5

c++ 不规范初始化时,出现的一系列奇怪问题解决(引发了异常 读取访问权限冲突)

今天公司的c++ 项目,需要加一下小功能,读取配置,控制业务功能开启

问题原因

这是有一段main 方法内的代码块 nacos 初始化并注册的代码

    nacos::Nacos nacos(GetIpAddress().value(), PORT, NACOS_APPNAME);
    nacos.namespaceId = NACOS_NAMESPACEID;
    nacos::NacosClient cli(&nacos);
    cli.registerNacos();

但是如果加上if 之后 或者代码提出来到外部方法内 就会出现问题了

if(flag){
    nacos::Nacos nacos(GetIpAddress().value(), PORT, NACOS_APPNAME);
    nacos.namespaceId = NACOS_NAMESPACEID;
    nacos::NacosClient cli(&nacos);
    cli.registerNacos();
}

void  run(){
    nacos::Nacos nacos(GetIpAddress().value(), PORT, NACOS_APPNAME);
    nacos.namespaceId = NACOS_NAMESPACEID;
    nacos::NacosClient cli(&nacos);
    cli.registerNacos();
}

就会出现 引发了异常: 读取访问权限冲突 问题 图片就不粘贴了 这里开了个线程跑了个方法监听发送心跳检测

 void nacos::NacosClient::beatNacos()
	{
		pthread_create(&beatNacosThread, NULL, action::BeatNacosThread, this);
	}

void* BeatNacosThread(void* args) {
			NacosClient& cli = *(NacosClient*)args;
			Nacos *nacos = cli.getNacos();

就在这一段出现的问题 BeatNacosThread 方法的 参数 传递的是NacosClient 指针,但是指针指向的堆空间损坏了。方法内读取参数就会出现(读取访问权限冲突问题)

问题解决

其实也很简单: 使用new 实例化

 nacos::Nacos *nacos = new Nacos(LOCAL_IP, PORT, NACOS_APPNAME);
		 nacos->namespaceId = NACOS_NAMESPACEID;
		 nacos::NacosClient *cli = new NacosClient(nacos);
		 cli->registerNacos();
		 cli->getNacosConfig();
		 cli->listenNacosConfig();

问题总结

默认的实例化方式是其实调用的c 的 malloc 函数 malloc 函数实例化的对象堆的内存空间是动态的,如果方法执行完成 或者 在if 语句块也是同样的原理,方法内的对象 或 if 语句块中的对象 内存就会损坏, 但是如果用 new 的话 创建的对象堆内存不是动态的。方法执行完毕也不会损坏。清理空间方法是使用 delete 关键字。

参考资料 读取字符串的字符时出错 无法读取内存 vs debug模式下显示“变量已被优化掉因而不可用”的解决办法 C中的malloc和free释放原理 c++调试出现“读取字符串的字符时出错”,无法读取内存? 以及malloc函数和new 的区别