在VC2012中,我想使用唯一指针和删除器在构造函数中创建一个互斥锁,这样我就不需要创建一个析构函数来调用CloseHandle.
我原以为这会起作用:
struct foo
{
std::unique_ptr<HANDLE, BOOL(*)(HANDLE)> m_mutex;
foo() : m_mutex(CreateMutex(NULL, FALSE, NULL), CloseHandle) {}
}
Run Code Online (Sandbox Code Playgroud)
但在编译时我收到一个错误:
error C2664: 'std::unique_ptr<_Ty,_Dx>::unique_ptr(void *,int
(__cdecl *const &)(HANDLE)) throw()' : cannot convert parameter 1 from
'HANDLE' to 'void *'
Run Code Online (Sandbox Code Playgroud)
当我修改构造函数时:
foo() : m_mutex((void*)CreateMutex(NULL, FALSE,
(name + " buffer mutex").c_str()), CloseHandle) {}
Run Code Online (Sandbox Code Playgroud)
我变得更加不寻常:
error C2664: 'std::unique_ptr<_Ty,_Dx>::unique_ptr(void *,
int (__cdecl *const &)(HANDLE)) throw()' : cannot convert
parameter 1 from 'void *' to 'void *'
Run Code Online (Sandbox Code Playgroud)
我现在不知所措.HANDLE是void*的typedef:我需要了解一些转换魔法吗?
我在.h文件中有一个类:
class Blah
{
public:
Blah(){}
virtual ~Blah(){}
void WriteMessage( bool MessageReceived )
{
if(MessageReceived)
{
cout << "Message Recieved\n";
}
}
};
Run Code Online (Sandbox Code Playgroud)
我试图弄清楚为什么我的代码不起作用,所以我在函数内部的条件设置了一个断点WriteMessage()
,但是一旦我开始在调试模式下运行项目,断点就消失了,它的工具提示说:
断点当前不会被击中.
没有与此行关联的可执行代码.
我不知道为什么会发生这种情况,因为在.h文件中实现其他类的所有其他成员函数都可以正常工作.是什么造成的?
编辑:好的,按照要求,这是我正在使用的真实代码的精简版:
VimbaBridgeAPI.h(.dll的头文件)
#pragma once
#ifdef VIMBABRIDGEAPI_EXPORTS
#define VIMBABRIDGEAPI_API __declspec(dllexport)
#else
#define VIMBABRIDGEAPI_API __declspec(dllimport)
#endif
#include "AlCamIncludes.h"
#include "VimbaSystem.h"
////////////////////////////////////////////
// Global Variables ///////////////////////
////////////////////////////////////////////
extern HBITMAP hbit;
extern CEdit* global_filenamehandle;
////////////////////////////////////////////
// Global Flags ///////////////////////////
////////////////////////////////////////////
extern bool imageReady;
extern bool take_picture;
using namespace AVT::VmbAPI;
VIMBABRIDGEAPI_API void BridgedGetImage(FramePtr framepoint, …
Run Code Online (Sandbox Code Playgroud) 是的我知道*是一个指针.那不是我在说什么.在我的一个程序中,我有一个断点设置,我注意到在汽车中有一个__vfptr
带有值的变量0x000007feed210a00
.
但是在类型下,它只是说*就是这样.我程序中的所有其他指针都有类似unsigned char*
or some::namespace::Frame*
或or的类型int*
.这些是有意义的,因为指针直接绑定到特定的类或数据类型.但我不知道*可能是,是否只有普通的指针类型?
编辑:我正在使用Visual Studio 2010.
我有一个文件foo.h
,其中包含各种函数声明.所有这些功能都在一个文件中实现foo.dll
.但是,当我包含.h文件并尝试使用任何函数时,我收到错误:
bar.obj : error LNK2019: unresolved external symbol SomeFunction
Run Code Online (Sandbox Code Playgroud)
显然没有找到功能实现.
我该怎么做才能帮助编译器找到DLL中的定义并将它们与.h文件关联起来?
我已经看过一些关于它的东西__declspec(dllexport)
,__declspec(dllimport)
但我仍然无法弄清楚如何使用它们.
据我所知,这个错误是由于当你有多个文件包括同一个文件时没有正确使用标题保护引起的.在我的例子中,这是导致错误的包含树:
File A includes Z, which contains the functions I need. File B includes A, and file C includes A.
没有任何东西#pragma once
,该程序给出了一堆相同错误的变体:
blahblah.obj: error LNK2005: class some::namespace::ObjectType Object already
defined in dialogDlg.obj
Run Code Online (Sandbox Code Playgroud)
我只是想知道,鉴于我描述的包含树,正确编译它的正确方法是什么?
我尝试使用#pragma once
文件Z,但这不起作用.我还在文件A上尝试了#pragma一次,但也没有用.最后我在A和Z上都尝试过,也没用.
如果我有一个程序:
#include <iostream>
using namespace std;
int TestIntReturn(int &x, int &y)
{
x = 1000;
y = 1000;
return x+y;
}
int main()
{
int a = 1;
int b = 2;
cout << a << " " << b << endl;
TestIntReturn(a,b);
cout << a << " " << b << endl;
}
Run Code Online (Sandbox Code Playgroud)
TestInReturn(a,b)
由于它未被使用,返回值会发生什么变化?
我有一个MFC应用程序AVT_testapp,并在头文件(AVT_testappDlg.h)中我试图在所有函数,类等之外创建一个变量,以使其全局.每当我尝试这样做时(比方说我尝试int x = 7
),我得到错误:
1>AVT_testappDlg.obj : error LNK2005: "int x" (?x@@3HA) already defined in
AVT_testapp.obj
1>..\..\bin\x64\Debug\AVT_testapp.exe : fatal error LNK1169: one or more
multiply defined symbols found
Run Code Online (Sandbox Code Playgroud)
我在谷歌上发现的一切都说"只需添加标题保护". AVT_testappDlg有6个#include,每个都有头部防护.
创建全局变量时还有什么可能导致这些错误?
编辑:这是我的头文件的开头,
#pragma once
#include "../../src/CoreUtils/nierr.h"
#include "..\..\src\CoreUtils\StringHelpers.h" //includes windows.h
#include "afxwin.h"
#include "afxcmn.h"
#include "IFrameObserver.h"
#include "c:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include\GdiPlusHeaders.h"
//#include <fstream>
//#include <windows.h>
int x = 7;
using namespace AVT::VmbAPI;
//////////////////////////////////////////////////////////////////////////
////////// MyObserver class ///////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
class MyObserver : public IFrameObserver
{
private:
MyObserver( MyObserver& );
MyObserver& …
Run Code Online (Sandbox Code Playgroud) 标题说明了一切.
我发现了一个基本相同的旧问题,但我需要进一步澄清.
在这个问题中,接受的答案是:
Run Code Online (Sandbox Code Playgroud)char* text = "Hello, world";
这里自动变量(指针)在堆栈上创建并设置为指向常量内存中的值,这意味着:
- ""中的字符串文字存在于整个程序执行中.
- 您不负责"分配"或"释放"它
- 你可能不会改变它.如果你想改变它,那么你必须分配一些"非常量内存"并将其复制到那里.
这是说指针被删除了,而不是指针指向的数据?如果我要在函数中创建1,000,000个指向字符的指针,当它们超出范围时我的所有内存都会被释放?或者只是制作指针所需的内存,将实际角色本身留在后面以占用我所有的记忆?
我最近在处理一个项目时遇到了这个问题,这让我有点困惑.所以我决定编写一个测试程序来获得明确的答案:
#include <iostream>
using namespace std;
class layer3{
public:
layer3(){}
~layer3(){}
private:
};
class layer2{
public:
layer2(){}
~layer2(){}
layer3* GetBAddress(){return &b;}
private:
layer3 b;
};
class layer1{
public:
layer1(){}
~layer1(){}
//returns the address of a, which is a 'layer2' object
layer2* GetaAddress(){return &a;}
//returns the address of b, which is is a layer 3 object
layer3* GetDeepBAddress(){return a.GetBAddress();}
private:
layer2 a;
};
int main(){
layer1 t;
cout << &t << " : layer 1's address" << endl;
cout << t.GetaAddress() …
Run Code Online (Sandbox Code Playgroud) 我曾经有过几次使用 Visual Studio 和其他东西编写程序的情况,在换行符的某个地方。当然,我的第一个想法是在程序的早期设置一个断点,然后缓慢地逐行单步执行代码,直到出现错误。
但很多时候,我发现在调试器中缓慢单步执行代码时一切正常。但是,当我尝试在没有断点的情况下运行程序时,就会出现问题。
为什么会出现这种情况?逐行单步执行代码实际上与仅在调试模式下运行程序不同吗?
(我不是在谈论调试与发布,而是在谈论调试与逐行调试)