关于重载全局的operator delete 问题

//base.h
#ifndef BASE_H
#define BASE_H
#include<cstddef>
extern void* operator new(const size_t size,const char *file,const size_t line);
extern void operator delete(void *pv);

//base.cpp
#include "base.h"
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

void* operator new(const size_t size,const char *file,const size_t line)
{
        std::cout << "new:" << std::endl;
        return malloc(size);
}

void operator delete(void *pv)
{
        std::cout << "delete:" << std::endl;
        free (pv);
}

//main.cpp
#include "base.h"
int main()
{
        int *pt = new int;
        delete pt;
        return 0;
}

//上面的代码编译报错,说delete重定义了,我把那个#include 去掉(主要是包含了new.h),程序编译通过,而且,程序运行也是调用的重载函数,这时为何?后面,我把他们合并到main.cpp 中,发现一切又是正常的(包含iostream.h),