我正在尝试查找动态和静态实例化的对象编号。我收到的错误是未声明变量myheap。
#include<iostream.h>
#include<stdlib.h>
class A {
public:
static int x; //To count number of total objects. incremented in constructor
static int myheap; //To count number of heap objects. Incremented in overloaded new
void* operator new(size_t t) {
A *p;
p=(A*)malloc(t);
myheap++;
return p;
}
void operator delete(void *p) {
free(p);
myheap--;
}
A() {
x++;
}
~A() {
x--;
}
};
int A::x=0;
int A::myheap=0;
int main() {
A *g,*h,*i;
A a,c,b,d,e;//Static allocations 5
g= new A();//Dynamic allocations 3
h= new A();
i= new A();
cout<<"Total"<<A::x<<'\n';
cout<<"Dynamic";
cout<<'\n'<<"HEAP"<<A::myheap;
delete g;
cout<<'\n'<<"After delete g"<<A::x;
cout<<'\n'<<"HEAP"<<A::myheap;
delete h;
cout<<'\n'<<"After delete h"<<A::x;
cout<<'\n'<<"HEAP"<<A::myheap;
delete i;
cout<<'\n'<<"After delete i"<<A::x;
cout<<'\n'<<"HEAP"<<A::myheap;
}
答案 0 :(得分:0)
应为A::myheap
。
此外,您的operator new应该调用构造函数:
你是对的,你只需要将指针返回到新分配的对象。
void * operator new(size_t t)
{
A *p = (A*)malloc(t);
myheap++;
return p;
}
答案 1 :(得分:0)
您没有本地名为myheap
但您有一个名为myheap
的类范围的静态变量。因此,您需要A::myheap
。但实际上,myheap
和x
应该是私有的,您应该定义静态getx
和静态getmyheap
公共方法。当然,x
应该有一个更好的名字。
答案 2 :(得分:0)
您的代码几乎是正确的,但您看到有关'myheap'的错误,因为编译器对早期错误感到困惑。首先修复第一个错误。
关于重载operator new,除了简单的malloc之外还有更多内容。我有一个可能有帮助的previous example,但这是全新的,而不是特定于类。
这里清理:(编译并运行)
#include <iostream>
#include <memory>
#include <new>
#include <stdlib.h>
struct A {
static int count;
static int heap_count;
void* operator new(std::size_t t) {
void* p = malloc(t);
if (!p) throw std::bad_alloc();
heap_count++;
return p;
}
void operator delete(void *p) {
free(p);
heap_count--;
}
A() {
count++;
}
~A() {
count--;
}
};
int A::count = 0;
int A::heap_count = 0;
int main() {
using namespace std;
A a, b, c, d, e;
auto_ptr<A> g (new A), h (new A), i (new A);
cout << "Total: " << A::count << '\n';
cout << "Dynamic\nHeap: " << A::heap_count << '\n';
g.release();
cout << "After delete g: " << A::heap_count << '\n';
h.release();
cout << "After delete h: " << A::heap_count << '\n';
i.release();
cout << "After delete i: " << A::heap_count << '\n';
cout << "Heap: " << A::heap_count << '\n';
return 0;
}
答案 3 :(得分:0)
和Sandeep,
当new没有返回p时你得到核心转储的原因是你的删除函数试图释放你传入的指针。
由于new没有返回p,因此发送到delete()的值为NULL或未初始化。使用NULL指针或来自堆栈的随机值调用free将导致程序崩溃。
最佳,
萨姆