我正在为Windows和Unix编写一个跨平台的C++程序.在Window端,代码将编译并执行没有问题.在Unix方面,它会编译然而当我尝试运行它时,我得到一个分段错误.我最初的预感是指针存在问题.
找到并修复分段错误错误的好方法是什么?
为什么要一个会替换默认的操作new和delete使用自定义new和delete运营商?
这是继续重载新的和删除在非常有启发性的C++ FAQ:
运算符重载.
本FAQ的后续条目是:
我应该如何编写符合ISO C++标准的自定义new和delete运算符?
注意:答案基于Scott Meyers的"更有效的C++"课程.
(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)
c++ operator-overloading c++-faq new-operator delete-operator
如purify和valgrind等内存泄漏检测工具如何工作?
如何设计和实现我自己的工具?
在C/C++编程时,我已经阅读了很多程序员的说法和写作,有很多与内存有关的问题.我打算学习用C/C++编程.我对C/C++有初学者知识,我想看一些简短的示例,说明为什么C/C++会出现内存管理问题.请提供一些样品.
我决定在我的类中重载new,new [],...运算符,这样我就可以记录它们被调用的文件和行,这样我就可以更轻松地跟踪内存分配/泄漏.
现在问题出在我的堆栈和数组类(以及其他分配内存的模板容器类)中:
如果我将它们与我的一个具有new,new [],...运算符的类一起使用它可以正常工作.
但是如果我将它与标准的c ++数据类型(int,float,...)一起使用,我就无法分配它们,因为没有重载的new运算符匹配new(__ LINE __,__ FILE __)运算符的参数(或者其他人喜欢安置新的).
堆栈代码示例:
// placement new
T* t=new(__ LINE __ , __ FILE__)(&m_data[i])T;
Run Code Online (Sandbox Code Playgroud)
所以我对如何使这项工作有好主意.如果我用新的松散内存记录功能替换new(__ LINE __,__ FILE __).一种解决方案是为标准数据类型创建一个分离的堆栈,其中使用默认的new.
有没有办法在编译时检测模板参数是结构,类还是内置的c ++类型?
你怎么处理这样的东西?你有什么建议?任何关于这种设计的评论(好的,坏的)显然都是受欢迎的(只是不要张贴诸如"不要用自己的容器重新发明轮子"之类的东西).
我正在尝试编写内存分析器,到目前为止我已经能够使我的自定义函数适用于malloc,free,new和delete.我尝试使用__FILE__和__LINE__在重载的新方法中记录发起者,但是(正如预期的那样)它只是给出了重载函数的详细信息.有没有办法在没有对正在测试的组件的现有代码进行任何更改的情况下(例如#malline for malloc)对重载函数获取有关创建者的详细信息?
我正在使用的功能是:
void* operator new (size_t size)
{
if(b_MemProfStarted)
{
b_MemProfStarted = false;
o_MemLogFile << "NEW: " << "| Caller: "<< __FILE__ << ":"
<< __LINE__ << endl;
b_MemProfStarted = true;
}
void *p=malloc(size);
if (p==0) // did malloc succeed?
throw std::bad_alloc(); // ANSI/ISO compliant behavior
return p;
}
Run Code Online (Sandbox Code Playgroud)
bool b_MemProfStarted用于避免对ofstream和map.insert的递归调用.
我编写了下面的堆调试器,以便向初级程序员演示内存泄漏,双删除和错误形式的删除(即尝试删除数组delete p而不是delete[]p).
我很想从强大的C++程序员那里得到一些反馈,因为我以前从未这样做过,我确信我做过一些愚蠢的错误.谢谢!
#include <cstdlib>
#include <iostream>
#include <new>
namespace
{
const int ALIGNMENT = 16;
const char* const ERR = "*** ERROR: ";
int counter = 0;
struct heap_debugger
{
heap_debugger()
{
std::cerr << "*** heap debugger started\n";
}
~heap_debugger()
{
std::cerr << "*** heap debugger shutting down\n";
if (counter > 0)
{
std::cerr << ERR << "failed to release memory " << counter << " times\n";
}
else if (counter < 0)
{
std::cerr …Run Code Online (Sandbox Code Playgroud)