静态类成员声明错误

时间:2010-01-06 03:48:01

标签: c++

我正在尝试查找动态和静态实例化的对象编号。我收到的错误是未声明变量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;
}

4 个答案:

答案 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。但实际上,myheapx应该是私有的,您应该定义静态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将导致程序崩溃。

最佳,

萨姆