草庐IT

c++ - 在库 API 中传递 std::string

我们目前正在为某个库构建API。部分接口(interface)需要库获取并返回给用户类,如vector、string。当尝试在简单场景中模拟库的使用时,在Debug模式下,系统会在将字符串作为输入传递时崩溃。我相信在调试或Release模式下字符串类有不同的表示。然后我们的库假设接收到某种表示,错误地读取数据成员并一路崩溃。那么在API中传输STL对象的最佳方法是什么。目标操作系统是使用MSVC8编译的WindowsXP,尽管库用户将使用Windows,但他们的编译器可能(并且可能会)不同到目前为止我们的想法:将字符串更改为char*-但开发人员可能会对释放内存的责任感到困惑。使用我们

c++ - 在 C 中返回堆栈数据;它是否正确取消分配?

我在审查一位friend的代码时,就C/C++如何在堆栈上分配内存和管理其释放展开了一场有趣的辩论。如果我要在一个函数中创建一个包含10个对象的数组,但返回该数组,它是在函数弹出时释放(因此使给定数据无效)还是放入堆中(这引发了我们如何释放它?)。示例代码如下:Gene*GetTopTen(){//Create10genes(or10objects,doesn'tmatter)GeneTen[10];//SortoutexternalpooldataSort();//Copyoverdatatothearrayof10objectsfor(inti=0;i非常感谢任何帮助,这正在变成一

c++ - 在 Visual Studio 2010/2012 和 Release 模式下使用 SSE 内部函数时结果不正确

我正在使用SSE内在函数计算数组的均值和方差。基本上,这是可以在以下程序中说明的值及其平方的总和:intmain(intargc,constchar*argv[]){unionu{__m128m;floatf[4];}x;//Allocatememoryandinitializedata:[1,2,3,...stSize+1]constsize_tstSize=1024;float*pData=(float*)_aligned_malloc(stSize*sizeof(float),32);for(size_ts=0;s现在,当我在Debug模式下编译和运行程序时,我得到以下(正确的)

OpenCV在Release模式下读取不到视频解决方法

一、开发环境Widnows10操作系统OpenCV4.5版本VisualStudio2019IDE二、遇到问题我这个问题不是直接遇到的,是在我看着教程,跟着练习到中间的某一个demo的时候遇到的,然后我在网上找原因,找了一圈没有我想要的结果。我的开发环境搭建的没问题,跑图片例程啥的都很好,就是到跑视频例程的时候就直接读取不了视频,就是程序报错,报错代码看不懂,如下:0x00007FFB4E924F69处(位于opencv2_demo.exe中)有未经处理的异常:MicrosoftC++异常:cv::Exception,位于内存位置0x0000002C707EE6F0处。三、解决方法我就一直在回

c++ - Visual Studio 2010 上的 VC++ : Release builds using debug heap

我正在对一个慢速C++应用程序进行基准测试/优化,在拍摄一些堆栈快照时,我发现我的应用程序的发布版本正在使用调试堆,因为找到的一些堆栈跟踪表明:ntdll.dll!string"Enablingheapdebugoptions\n"()+0x11056bytes这是一个在Windows7上运行的64位应用程序。我在完全相同的在线环境中看到两三个关于此问题的其他投诉,但没有任何回应。有没有人知道为什么Windows或VisualStudio会使用调试堆来发布构建C++项目? 最佳答案 Thedebugheapisusedwhenapr

c++ - 调试构建编译比发布慢得多

在VisualStudio2005下,我们有一个包含195个cpp文件的库,构建发布版需要大约2分钟,调试版构建需要大约6分钟。我一直认为发布构建应该因为优化而需要更长的时间。为什么调试构建比发布花费的时间长得多?有没有办法加快我们的调试构建速度,使其与发布速度一样快?我们确实有相当数量的boost/STL代码。 最佳答案 最佳猜测:调试版本受I/O限制,而发布版本受处理器限制(在本例中)。我们已经对我们的构建系统进行了广泛的基准测试——许多大型项目,一些小型项目。DEBUG构建写出大量*.pdb信息、更大的*.obj文件(用于额外

c++ - std::unique_lock::release 的用例是什么?

在什么情况下会使用std::unique_lock的release方法?我错误地使用了release方法而不是unlock方法,我花了一段时间才明白为什么下面的代码不起作用。#include#include#include#include#includestd::mutexmtx;voidfoo(){std::unique_locklock(mtx);std::coutthreads;for(inti=0;i 最佳答案 它在thisanswer中有很好的用途其中锁定状态的所有权明确地从函数本地unique_lock转移到外部实体(通

c++ - 内存处理(即函数 Release)究竟如何与 Direct3D 一起工作?

我在我的Direct3D应用程序中遇到了一个泄漏,我最终纠正了它,但我认为泄漏的原因是由于我对Direct3D处理其内存和接口(interface)的方式的误解。我无法找到关于它的权威文章/教程(如果有请提供),但根据我收集到的信息,它是这样工作的:每次调用Get方法时,返回对象的引用数都会增加。因此,如果我调用GetRenderTarget,被渲染到的表面的引用计数会增加。在接口(interface)上调用Release会减少其引用计数。前两点结合起来本质上意味着:每次获得接口(interface)时,用完后释放它。当引用计数达到0时,实例将被删除。我不完全确定这是否正确,但它似乎在

c++ - auto_ptr、immediate get() 和 release()——有用吗?

我正在处理别人的代码,其中包含很多这样的语句std::auto_ptrsmartptr(newObjectA(this));objects_list.push_back(smartptr.get());smartptr.release();这个有用吗?在这里使用智能指针而不是仅仅写有什么实际原因吗?objects_list.push_back(newObjectA(this)); 最佳答案 objects_list.push_back(newObjectA(this));这可能会泄漏内存。让我们看看当我们分解它时会发生什么:newO

c++ - 如果调试运行正常但发布崩溃怎么办

我有一个应用程序在调试版本中运行良好,但是当我在发布版本中启动它时,我得到一个unhandledExceptionat0x0043b134inmyapp.exe:0xC0000005:Accessviolationwhilereadingatposition0x004bd96c如果我点击“中断”,它会告诉我没有加载任何符号,并且无法显示源代码。在这种情况下,我该怎么做才能追踪到问题? 最佳答案 这种问题往往是由于未初始化的变量。我会从那里开始寻找你的问题。Debug模式更为宽容,因为它通常被配置为初始化尚未显式初始化的变量。也许您正