重载操作符new / allocate大于对象大小
Overloading operator new / allocate more than object size
我试图重载我的类的operator new,我想为对象的属性和在类中未定义的字符向量分配空间。
但是当我实例化一个新对象时,前一个对象的字符正在改变。我做错了什么吗?
class StringData
{
public:
friend class String;
int refCount;
int len;
int maxLen;
~StringData()
{
}
StringData()
{
maxLen = 1000;
len = 0;
refCount = 1;
}
StringData(const char * string)
{
maxLen = 1000;
char * data = buffer();
len = 0;
while (string[len] != ' ' && len < (maxLen - 1))
{
data[len] = string[len];
len++;
}
data[len] = ' ';
refCount = 1;
}
char* buffer()
{
return reinterpret_cast<char*>(this + 12);
}
public:
void* operator new(size_t size, int maxLen)
{
return ::operator new(size + round4(maxLen + 1));
}
static int round4(int len)
{
return ((((int) (len / 4)) + 1) * 4);
}
void operator delete(void* obj)
{
::operator delete(obj);
}
void operator delete(void* obj, int size) throw ()
{
::operator delete(obj);
}
};
我在其他类中使用:
class String{
public:
StringData * data;
String(StringData * data){
this->data = data;
}
public:
String(const char*);
String(const String&);
~String();
String& operator =(const String);
String& operator =(const char *);
int length() const;
bool operator ==(const String&) const;
int compare(const String&) const;
bool operator ==(const char*) const;
int compare(const char*) const;
String& operator +(const String&) const;
String operator +(const char*) const;
String operator +=(const String&);
String operator +=(const char*);
String toLower();
String toUpper();
char operator [ ](int) const;
char& operator [ ](int);
void print() const;
};
String::String(const char * string){
int stringLen = 0;
while (string[stringLen] != ' ')
stringLen++;
data = new (stringLen + 1) StringData(string);
}
String::String(const String& string){
data = string.data;
string.data->refCount++;
}
String::~String(){
this->data->refCount--;
if (this->data->refCount == 0)
delete data;
}
String& String::operator=(const String string){
data->refCount--;
if (this->data->refCount == 0)
delete data;
data = string.data;
string.data->refCount++;
return *this;
}
void String::print() const{
printf("%sn", data->buffer());
}
我的主要功能是:
int main(){
String *a = new String("boisahzashdacaraverdeepretaeazuleamarelaecinzaevermelha");
a->print();
String * s = new String("freestepehnoisquevoaashashashhasshashhasssasassadasd");
String * b = new String("kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk");
a->print();
s->print();
return 0;
}
当我执行时,字符串被打破了:
boisahzashdacaraverdeepretaeazuleamarelaecinzaevermelha
boisahzashdacaraverd
freestepehnoisquevoa
这不是一个好主意:
return reinterpret_cast<char*>(this + 12);
不仅在添加/删除一些成员函数[或创建虚函数]时失败,而且还依赖于int
的大小。
return reinterpret_cast<char*>(this) + sizeof(*this);
[注:reinterpret_cast<>()结尾的newplacement !!]第一个版本向前跳过12 * sizeof(*this)
字节,而不是跳过12
字节。[当然,在我的机器上,当我使用maxLen的4*乘数时,它实际上是有效的-只有当我删除它时才开始失败]
可以简化为:
((((int) (len / 4)) + 1) * 4);
这个应该是maxlen:
的4倍大吗?(4 * maxLen)
:
4 * (len / 4 + 1);
一旦我知道关于它是如何被测试的评论的答案,我会回来编辑这个答案。 相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 如何返回一个类的两个对象相加的结果
- 使用std::函数映射对象方法
- 是否需要删除包含对象的"pair"?
- 使用 new in C++(在 Windows 上)分配大于 2GB 的单个对象
- 对大于属性的元素的矢量对象进行二进制搜索
- 搅拌器波前对象:人脸声明中的顶点数大于所有顶点数
- 重载操作符new / allocate大于对象大小