我们偶尔会遇到问题,即由于内存分配失败,我们长时间运行的服务器进程(在Windows Server 2003上运行)引发了异常.我们怀疑这些分配是由于内存碎片而失败的.
因此,我们一直在寻找一些可能对我们有帮助的替代内存分配机制,我希望有人可以告诉我最好的一个:
1)使用Windows 低碎片堆
2)jemalloc - 用于Firefox 3
3)Doug Lea的malloc
我们的服务器进程是使用跨平台的C++代码开发的,因此任何解决方案都可以理想地跨平台(do*nix操作系统会遭受这种类型的内存碎片吗?).
另外,我认为LFH现在是Windows Server 2008/Vista的默认内存分配机制吗?如果我们的客户只是升级他们的服务器操作系统,我当前的问题会"消失"吗?
我有基于范围控制互斥锁定/解锁的代码:
void PerformLogin()
{
ScopeLock < Lock > LoginLock( &m_LoginLock );
doLoginCommand();
ScopeLock < SharedMemoryBase > MemoryLock( &m_SharedMemory );
doStoreLogin();
...
}
Run Code Online (Sandbox Code Playgroud)
我可以保证MemoryLock
以前会被毁坏LoginLock
吗?
我们已经转移到使用boost::shared_ptr
所有代码,但是我们仍然有一些我们使用的孤立案例std::auto_ptr
,包括单例类:
template < typename TYPE >
class SharedSingleton
{
public:
static TYPE& Instance()
{
if (_ptrInstance.get() == NULL)
_ptrInstance.reset(new TYPE);
return *_ptrInstance;
}
protected:
SharedSingleton() {};
private:
static std::auto_ptr < TYPE > _ptrInstance;
};
Run Code Online (Sandbox Code Playgroud)
我被告知有一个很好的理由说明为什么没有这个shared_ptr
,但对于我的生活,我不明白为什么?我知道auto_ptr
最终会在下一个标准中被标记为折旧,所以我想知道我可以用什么/如何替换这个实现.
另外,你有没有其他原因考虑使用auto_ptr
而不是shared_ptr
?你认为将来有什么问题转移到shared_ptr吗?
编辑:
auto_ptr
与shared_ptr
在上面的代码",答案是肯定的-但我会带一个小的性能损失.auto_ptr
最终标记为折旧并且我们转向时std::shared_ptr
,我们需要彻底测试我们的代码以确保我们遵守不同的所有权语义.我被要求在现有客户端服务器应用程序中针对Active Directory对用户进行身份验证提供支持.
此时,用户从客户端计算机提供用户名和密码,通过线路(加密)传递到我们的服务器进程,并与存储在数据库中的用户名/密码进行匹配.
最初,我认为这将是一个容易解决的问题,因为我可以简单地从我们的服务器进程中针对Active Directory验证用户的名称/密码.但事实证明,用户不必从我们的客户端应用程序输入密码,而是从当前的Windows登录会话中获取其凭据.
我现在面临的问题是如何在没有密码的情况下使用Active Directory进行身份验证? 我确信必须有一种方法可以某种方式将某种"令牌"从客户端传递到我们的服务器进程,这可以用作另一种身份验证方法,但到目前为止我的研究已经画了一个空白.
我们的服务器是用C++编写的,所以我们将使用win32 API.我还打算使用运行Windows 2008 AD LDS的虚拟机来开发和调试它- 我希望这对我想要实现的目标是足够的.
非常感谢任何帮助或建议.
我正在使用VC9,我有一个CEdit控件,其内容被重置为默认测试(比如 - "填写"),只需单击一个按钮,然后我调用SetFocus进行CEdit控件.问题是光标在默认文本的开头闪烁,我希望它闪烁默认字符串的结尾.
如何才能做到这一点?
有没有办法利用GCC编译器,同时仍然可以通过Visual Studio IDE进行开发?
我们的项目是跨平台的,我经常遇到同事的麻烦,因为我正在检查不符合标准的代码(这可以归功于VS编译器!).
我仍然希望能够使用MS编译器进行编译,所以我可以继续调试等,但是我希望能够使用GCC 切换到编译,这样我才能确定我没有破坏在其他平台上构建.
这可能吗?
我们目前维护了一套设计相当好的MFC应用程序,但是用户界面开始变得疲惫不堪,而且很多代码需要进行相当多的重构以整理一些重复和/或性能问题.我们使用了很多自定义控件来处理他们自己的绘图(都使用MFC编写).
最近我一直在研究Qt及其提供的好处(跨平台并支持你可能称之为更专业的UI开发框架).
我的问题是 - 可能转向Qt框架的最佳方法是什么?Qt和MFC玩得好吗?开始将我们的一些自定义控件移植到Qt并逐渐将更多和更多集成到我们现有的MFC应用程序中会不会更好?(这可能吗?).
任何建议或以前的经验表示赞赏.
我知道在应用程序中创建太多线程并不是你可能称之为其他正在运行的进程的"好邻居",因为即使这些线程处于有效的休眠状态,也会消耗cpu和内存资源.
我感兴趣的是:睡眠线程消耗了多少内存(win32平台)?
从理论上讲,我假设在1mb的区域内(因为这是默认的堆栈大小),但我很确定它不到这个,但我不确定为什么.
任何有关这方面的帮助将不胜感激.
(我问的原因是我正在考虑引入一个线程池,我想通过创建一个包含5个线程的池来节省多少内存,而不是20个手动创建的线程)
我知道在一个dll中进行的内存分配然后随后在另一个dll中释放可能会导致各种问题,特别是关于CRT.在导出STL容器时,这些问题尤其成问题.我们之前遇到过这些问题(编写与我们的库链接的自定义Adobe插件时),我们通过定义我们在所有容器中使用的自己的分配器来解决这些问题,例如:
typedef std::vector < SessionFields,
OurAllocator < SessionFields > >
VectorSessionFields;
typedef std::set < SessionFields,
std::less < SessionFields >,
OurAllocator < SessionFields > >
SetSessionFields;
Run Code Online (Sandbox Code Playgroud)
在向我们的代码传递类型时,这很有效,但是我们遇到了一个问题,因为我们现在不得不在Adobe的SDK中调用一个函数来返回一个填充的向量,当它超出范围时会导致崩溃.
显然,在我的代码中最终免费的Adobe的SDK属于不同的堆中分配内存是一个问题.所以我想也许我可以做一些聪明的事情,比如以某种方式覆盖或导出SDK中使用的分配器,这样我就可以用它来清理从它们的函数返回的容器.
我也在考虑编写一个包装器或某种类型的thunking层,从而可以在我的代码和SDK之间安全地编组STL容器(虽然这听起来非常混乱).
或者,我也在考虑使用GetProcessHeaps
来识别SDK 中使用的堆,并尝试释放这个堆,而不是默认堆.
有没有人就如何解决这个问题提出任何建议?