技术宅的结界

 找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 47|回复: 2
收起左侧

C++全局对象未能调用构造问题

[复制链接]

4

主题

10

帖子

67

积分

用户组: 小·技术宅

UID
5569
精华
0
威望
2 点
宅币
53 个
贡献
0 次
宅之契约
0 份
在线时间
7 小时
注册时间
2020-1-31
发表于 2020-6-30 23:09:58 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有帐号?立即注册→加入我们

x
情形:
库A(A.h+A.cpp)中封装了一个内存管理类classA,
在一个头文件B.h中声明一个全局对象globalclassA,然后用它的方法重载了new和delete,
现在想要在代码中直接使用重载后的new和delete,但是遇到了问题:
内存管理类的对象被分配了对应的内存,却没有被构造。
请问有什么好的解决方案吗?(MSVC编译器)
回复

使用道具 举报

1061

主题

2452

帖子

6万

积分

用户组: 管理员

一只技术宅

UID
1
精华
221
威望
348 点
宅币
19569 个
贡献
40535 次
宅之契约
0 份
在线时间
1853 小时
注册时间
2014-1-26
发表于 2020-7-1 04:42:44 | 显示全部楼层
从可执行文件的结构上来分析的话:通常情况下编译器会给你的全局初始化类生成构造函数,并且在CRT运行库初始化的时候调用这些函数。有时候编译器会将这些构造相关的函数或数据放到特定的区段(不一定是.text。有的时候是.ctor等)在这种情形下,如果你的编译工具链不是它的原生环境,或者你使用了某种链接器脚本,丢弃了诸如.ctor段等,就会导致全局变量无法被构造。

并不清楚你的运行环境是不是标准的exe、elf,还是单片机等嵌入式环境。

4

主题

70

帖子

1016

积分

用户组: 上·技术宅

UID
4293
精华
4
威望
12 点
宅币
712 个
贡献
190 次
宅之契约
0 份
在线时间
71 小时
注册时间
2018-9-19
发表于 2020-7-1 22:22:24 | 显示全部楼层
请问你的new是不是在另一个全局对象的构造函数中?有可能这个全局对象比A先构造,你无法保证编译器先构造谁,后构造谁。

本版积分规则

QQ|申请友链||Archiver|手机版|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图  

GMT+8, 2020-8-5 18:22 , Processed in 0.099912 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表