使用调试版本静态库时,C++ 成员变量未初始化
C++ member variables are not initialized when using a debug version static library
- 环境:Windows10、cpp17、visual studio2019、调试版静态库
最近在我的项目中尝试使用Cesium-Native来读取3DTiles文件,但是遇到了一些成员变量没有正确初始化的困惑问题。
如下代码所示,Tileset()使用初始化列表来初始化其成员变量,但其中一些像_loadsInProgress
,_previousFrameNumber
被初始化为随机值,应该为0。但是其中一些被初始化正确地类似于 _url
、_options
,并且它在 Release Library 中运行良好,并且在其原始项目中具有相同的代码。多么奇怪的错误!
Tileset::Tileset(
const TilesetExternals& externals,
const std::string& url,
const TilesetOptions& options)
: _externals(externals),
_asyncSystem(externals.asyncSystem),
_userCredit(
(options.credit && externals.pCreditSystem)
? std::optional<Credit>(externals.pCreditSystem->createCredit(
options.credit.value(),
options.showCreditsOnScreen))
: std::nullopt),
_url(url),
_isRefreshingIonToken(false),
_options(options),
_pRootTile(),
_previousFrameNumber(0),
_loadsInProgress(0),
_subtreeLoadsInProgress(0),
_overlays(*this),
_tileDataBytes(0),
_supportsRasterOverlays(false),
_gltfUpAxis(CesiumGeometry::Axis::Y),
_distancesStack(),
_nextDistancesVector(0) {
if (!url.empty()) {
CESIUM_TRACE_USE_TRACK_SET(this->_loadingSlots);
this->notifyTileStartLoading(nullptr);
LoadTilesetDotJson::start(*this, url).thenInMainThread([this]() {
this->notifyTileDoneLoading(nullptr);
});
}
}
通过调试发现_loadsInProgress一开始是0,调用vector构造函数时发生变化。可能是因为生成调试静态库?
如有任何建议,我们将不胜感激!
通过仔细检查 运行 中的所有设置正确地解决了原始项目和我的项目的问题。并尝试清理 Visual Studio 缓存并重建项目和库可能有助于解决问题。
起初我对inlucde和lib文件使用不同的库版本,然后我发现,我将相同版本的库include文件更改为我的项目。但是由于 VS 缓存和相同的文件名(我猜),更改实际上未能应用到我的项目。
- 环境:Windows10、cpp17、visual studio2019、调试版静态库
最近在我的项目中尝试使用Cesium-Native来读取3DTiles文件,但是遇到了一些成员变量没有正确初始化的困惑问题。
如下代码所示,Tileset()使用初始化列表来初始化其成员变量,但其中一些像_loadsInProgress
,_previousFrameNumber
被初始化为随机值,应该为0。但是其中一些被初始化正确地类似于 _url
、_options
,并且它在 Release Library 中运行良好,并且在其原始项目中具有相同的代码。多么奇怪的错误!
Tileset::Tileset(
const TilesetExternals& externals,
const std::string& url,
const TilesetOptions& options)
: _externals(externals),
_asyncSystem(externals.asyncSystem),
_userCredit(
(options.credit && externals.pCreditSystem)
? std::optional<Credit>(externals.pCreditSystem->createCredit(
options.credit.value(),
options.showCreditsOnScreen))
: std::nullopt),
_url(url),
_isRefreshingIonToken(false),
_options(options),
_pRootTile(),
_previousFrameNumber(0),
_loadsInProgress(0),
_subtreeLoadsInProgress(0),
_overlays(*this),
_tileDataBytes(0),
_supportsRasterOverlays(false),
_gltfUpAxis(CesiumGeometry::Axis::Y),
_distancesStack(),
_nextDistancesVector(0) {
if (!url.empty()) {
CESIUM_TRACE_USE_TRACK_SET(this->_loadingSlots);
this->notifyTileStartLoading(nullptr);
LoadTilesetDotJson::start(*this, url).thenInMainThread([this]() {
this->notifyTileDoneLoading(nullptr);
});
}
}
通过调试发现_loadsInProgress一开始是0,调用vector构造函数时发生变化。可能是因为生成调试静态库?
如有任何建议,我们将不胜感激!
通过仔细检查 运行 中的所有设置正确地解决了原始项目和我的项目的问题。并尝试清理 Visual Studio 缓存并重建项目和库可能有助于解决问题。
起初我对inlucde和lib文件使用不同的库版本,然后我发现,我将相同版本的库include文件更改为我的项目。但是由于 VS 缓存和相同的文件名(我猜),更改实际上未能应用到我的项目。