我需要像C++中的UnSupportedOperationException这样的异常,但是找不到它.我希望它会在STL中,但看起来它不存在.我应该通过派生STL异常类来创建一个吗?
为什么我需要它?:我正在实现复合设计模式,它需要在基类中抛出不支持操作.Jave有它,但c ++没有.
题:
我的问题是如果我替换下面的函数foo1(我在我的代码中有),对我的应用程序内存占用或性能会有什么影响foo2.在应用程序中经常调用此函数.
#define SIZE 5000
void foo1()
{
double data[SIZE];
// ....
}
void foo2()
{
std::unique_ptr< double[] > data( new double[SIZE] );
// ....
}
Run Code Online (Sandbox Code Playgroud)
语境:
在实现新功能/模块后,我的MFC应用程序在运行Windows 7的嵌入式设备上加载速度非常慢.相同的应用程序在PC上快速加载.至少有一个区别和我怀疑的原因是嵌入式单元上的RAM真的很低,只有768 MB.
我调试它以找出这种延迟发生的位置,并在加载过程中记录应用程序中的时间戳.我发现的很有趣.当我双击exe时,记录第一个时间戳需要大约一分钟,之后它会快速运行,因此所有延迟都在那里.
我的理论是Windows正在花费所有这些时间来为exe设置环境,一旦完成,它就会快速运行.我怀疑这是因为在应用程序中堆栈上声明了很多大型结构,我不得不将其中一些移动到堆中以消除堆栈溢出错误,即使在具有新功能的PC上也是如此.
您认为低RAM机器上可执行文件加载速度慢或更准确的原因是什么?如果我把所有大型结构从堆栈移到堆上,你认为它会解决吗?
c++ performance memory-management visual-studio-2010 windows-7
我想很长一段时间使用虚函数,类对象必须用指针分配,但我运行了一个测试示例,它似乎对于堆栈上的对象完全有效,它只取决于你如何调用它的语法.但我正在做的事情几乎就像我正在创建一个'作弊'来使系统做我想要的,即使用普通的基类指针来调用派生类的虚方法.
#include <iostream>
using namespace std;
class B{
public:
virtual void call() { cout<<"B\n"; };
};
class D: public B{
public:
void call() { cout<<"D\n"; }
};
int _tmain(int argc, _TCHAR* argv[])
{
B b;
D d;
b.call(); // output is "B"
d.call(); // output is "D"
B* obj = &d;
obj->call(); // output is "D"
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这在发布软件中是否可以接受,还是会引起人们的注意?我可以在我的软件中使用它,但我之前没有见过这样的东西.
在我的实际项目中,我有基类和派生类,它们在堆栈上分配,让我们调用它们Base,DerivedA和DerivedB.我想重组并向基础添加虚函数,我想我现在必须在堆上分配它们,但看起来我没必要.现在我的应用程序可以在某些状态下,所有的操作都将完成DerivedA或DerivedB因此我打算增加一个指针对象:
Base * obj = &DerivedA;
Run Code Online (Sandbox Code Playgroud)
显然,当我需要切换操作到其他对象时,我只是这样做obj = &DerivedB …
从标题可以明显看出,我在MantisBT中输入了一个错误,但错误地选择了错误的项目。我可以返回并编辑bug的大多数参数,但是不允许我更改项目。我查看了配置,那里似乎也没有选择。有没有一种方法可以通过将项目更改为正确的值来修复错误信息?
我遇到的情况在理论上可能非常适合复合和迭代器设计模式,但这些模式的问题是无法访问底层数据结构,这可能会破坏交易。
当然,我可以在一个国家的一个城市的购物中心里有一家商店,这会产生整体关系,如果我制作它的复合模式,我可以在所有对象上(对于大多数部分)运行通用方法,比如商店/购物中心的时间打开和关闭,但实际上我们需要的不仅仅是这些。
以将此类复合结构从已保存的文件加载到树控件中的简单任务为例。现在我们甚至不知道哪个组件是什么,所以我们甚至无法确定一个组件是否应该是树中的父组件、同级组件或子组件。我们本质上必须进行某种类型检查,以找出首先反对哪种复合模式。对于外部迭代器尤其如此。
起初,这两种模式的结合似乎具有更大的潜力,但现在它们似乎没什么用处。
我试图找到这两种模式的真正理由。除了像函数这样简单的教科书示例之外,它还能在哪里使用得最好Print() cost()。我是否正确的是,当从文件加载复合材料时,必须将复合材料进行类型转换以填充树控件以反映复合材料的层次结构?
我有一个非常简单的类,它在线程中的函数完成时通知父线程.问题是在实例化它时,调用构造函数然后立即调用析构函数.这是班级:
AutoNotify::AutoNotify(HWND hWnd)
{
m_hWnd = hWnd;
::PostMessage( m_hWnd, IDM_THREAD_STARTED, 0 , 0 );
}
AutoNotify::~AutoNotify(void)
{
::PostMessage( m_hWnd, IDM_THREAD_FINISHED, 0 , 0 );
}
Run Code Online (Sandbox Code Playgroud)
以下是我在另一个类中使用此类的方法.
UINT CTestDlg::ThreadProc( LPVOID lpVoid)
{
int result = false;
CTestDlg *dlg = (CTestDlg *) lpVoid;
AutoNotify( dlg->m_hWnd );
if ( (result = dlg->LongFunction()) == ERROR_SUCCESS )
return result;
// more stuff
return TRUE;
}
Run Code Online (Sandbox Code Playgroud)
当我单步执行调试器时,它会调用AutoNotify构造函数,然后立即调用它的析构函数.我想也许是因为一些编译器优化,因为该类是空的!?比我声明它唯一的成员变量m_hWnd为volatile但仍然没用.任何人为什么要立即调用析构函数?
我用windbg运行这个可执行文件(文件菜单>打开可执行文件).我希望它不会找到符号文件,但确实如此!
我表示同情 .sympath srv*c:\test\Symbols*https://msdl.microsoft.com/download/symbols
对于输出lmIS
0:000> lm
start end module name
013b0000 013b8000 App C (private pdb symbols) c:\users\username\documents\visual studio 2013\Projects\App\Release\App.pdb
0f500000 0f571000 MSVCP120 (private pdb symbols) c:\test\symbols\msvcp120.i386.pdb\0B631FCA474F4F6FBBE54C497C5821361\msvcp120.i386.pdb
0f740000 0f82e000 MSVCR120 (private pdb symbols) c:\test\symbols\msvcr120.i386.pdb\16F5E2EF340A453ABC8B8F67DC6FD8082\msvcr120.i386.pdb
76860000 768a7000 KERNELBASE (pdb symbols) c:\test\symbols\wkernelbase.pdb\90BA6126FA6340F1ABFAE58DB8B7FB7D1\wkernelbase.pdb
769e0000 76af0000 kernel32 (pdb symbols) c:\test\symbols\wkernel32.pdb\515F42F53681439D989AC0FC08F7F8F72\wkernel32.pdb
77210000 77390000 ntdll (pdb symbols) c:\test\symbols\wntdll.pdb\B5ACAC3B4A6C4515AF416D60366399652\wntdll.pdb
Run Code Online (Sandbox Code Playgroud)
所以我正在运行的可执行文件c:\test\app\app.exe,如何在my documents文件夹中找到它的pdb文件?
我验证了,它没有缓存.
#include <Dbghelp.h>例如,如果您包含在控制台 C++ 应用程序中,它将不会从头文件中引入任何定义,并且或多或少会出现类似的编译器错误,就好像根本不包含此头文件一样。
编译器错误如下所示:
1>------ Build started: Project: ConsoleDump, Configuration: Debug Win32 ------
1> ConsoleDump.cpp
1>e:\projects\vs2015 projects\consoledump\consoledump\consoledump.cpp(23): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>e:\projects\vs2015 projects\consoledump\consoledump\consoledump.cpp(23): error C2146: syntax error: missing ';' before identifier 'Flags'
1>e:\projects\vs2015 projects\consoledump\consoledump\consoledump.cpp(23): error C2065: 'Flags': undeclared identifier
1>e:\projects\vs2015 projects\consoledump\consoledump\consoledump.cpp(23): error C2065: 'MiniDumpWithFullMemory': undeclared identifier
1>e:\projects\vs2015 projects\consoledump\consoledump\consoledump.cpp(24): error C2065: 'MiniDumpWithFullMemoryInfo': undeclared identifier
1>e:\projects\vs2015 projects\consoledump\consoledump\consoledump.cpp(25): error C2065: 'MiniDumpWithHandleData': undeclared identifier
1>e:\projects\vs2015 projects\consoledump\consoledump\consoledump.cpp(26): error C2065: 'MiniDumpWithUnloadedModules': undeclared identifier
1>e:\projects\vs2015 …Run Code Online (Sandbox Code Playgroud) 我正在运行以下脚本在GitHub上设置git存储库:
Global setup:
git config --global user.name "Your Name"
git config --global user.email email_id@email.com
Next steps:
mkdir MultiView
cd MultiView
git init
touch README
git add README
git commit -m 'first commit'
git remote add origin https://github.com/nalgene/MultiView.git
git push -u origin master
Run Code Online (Sandbox Code Playgroud)
最后一行git push -u origin master或者git push origin master那件事会返回一个错误:
fatal: https://github.com/naglene/MultiView.git/info/refs not found: did you run git update-server-info on the server?
Run Code Online (Sandbox Code Playgroud)
我研究了这个问题,看起来最可能的原因是打字错误(区分大小写),但我确信这不是问题.我git remote -v以前检查原点是否正确.还有什么问题呢?
有时我需要实例化一个类才能调用它的一个方法.例如,在Qt中读取注册表.
QSettings settings;
settings.setValue( DEST_FOLDER, destDir );
Run Code Online (Sandbox Code Playgroud)
但我改用这种语法.
QSettings().setValue( DEST_FOLDER, destDir );
Run Code Online (Sandbox Code Playgroud)
它有效,但我没有看到任何关于它的文档,它叫什么?我搜索了"无名的c ++类",但它没有出现.有匿名课程,但我认为这是不同的.
我的问题是它有点像调用构造函数..这种语法有没有名称?有人可以解释或指向我这种初始化的文档吗?愚蠢的问题但这样做不好吗?