- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
原来这是一个简单的构造函数误用问题。请参阅“编辑”部分以获取更新信息。
抱歉又问了一个 C++ dtor 问题...然而,我似乎无法找到与我的完全相同的一个,因为所有其他人都分配给 STL 容器(这将删除对象本身),而我的分配给一个指针数组。
所以我有下面的代码片段
#include<iostream>
class Block{
public:
int x, y, z;
int type;
Block(){
x=1;
y=2;
z=3;
type=-1;
}
};
template <class T> class Octree{
T* children[8];
public:
~Octree(){
for( int i=0; i<8; i++){
std::cout << "del:" << i << std::endl;
delete children[i];
}
}
Octree(){
for( int i=0; i<8; i++ )
children[i] = new T;
}
// place newchild in array at [i]
void set_child(int i, T* newchild){
children[i] = newchild;
}
// return child at [i]
T* get_child(int i){
return children[i];
}
// place newchild at [i] and return the old [i]
T* swap_child(int i, T* newchild){
T* p = children[i];
children[i] = newchild;
return p;
}
};
int main(){
Octree< Octree<Block> > here;
std::cout << "nothing seems to have broken" << std::endl;
}
查看输出我注意到析构函数在我认为它应该被调用之前被调用了很多次(因为 Octree 仍在范围内),输出的末尾还显示:
del:0
del:0
del:1
del:2
del:3
Process returned -1073741819 (0xC0000005) execution time : 1.685 s
Press any key to continue.
由于某种原因,析构函数在循环中经过同一点两次 (0),然后死亡。
所有这些都发生在“似乎没有出错”行之前,这是我在调用任何 dtor 之前所期望的。
提前致谢:)
编辑我发布的代码删除了一些我认为不必要的东西,但在复制和编译我粘贴的代码后,我不再收到错误。我删除的是代码的其他整数属性。原文如下:
#include<iostream>
class Block{
public:
int x, y, z;
int type;
Block(){
x=1;
y=2;
z=3;
type=-1;
}
Block(int xx, int yy, int zz, int ty){
x=xx;
y=yy;
z=zz;
type=ty;
}
Block(int xx, int yy, int zz){
x=xx;
y=yy;
z=zz;
type=0;
}
};
template <class T> class Octree{
int x, y, z;
int size;
T* children[8];
public:
~Octree(){
for( int i=0; i<8; i++){
std::cout << "del:" << i << std::endl;
delete children[i];
}
}
Octree(int xx, int yy, int zz, int size){
x=xx;
y=yy;
z=zz;
size=size;
for( int i=0; i<8; i++ )
children[i] = new T;
}
Octree(){
Octree(0, 0, 0, 10);
}
// place newchild in array at [i]
void set_child(int i, T* newchild){
children[i] = newchild;
}
// return child at [i]
T* get_child(int i){
return children[i];
}
// place newchild at [i] and return the old [i]
T* swap_child(int i, T* newchild){
T* p = children[i];
children[i] = newchild;
return p;
}
};
int main(){
Octree< Octree<Block> > here;
std::cout << "nothing seems to have broken" << std::endl;
}
此外,关于 set_child、get_child 和 swap_child 导致可能的内存泄漏的问题,这将得到解决,因为包装类将在设置之前使用 get 或使用 swap 获取旧子项并在释放之前将其写入磁盘内存本身。
我很高兴这不是我的内存管理失败,而是另一个错误。我还没有制作复制和/或赋值运算符,因为我只是在测试 block 树,我几乎肯定会很快将它们全部设为私有(private)。
这个版本吐出 -1073741819。
谢谢大家的建议,对于劫持我自己的帖子我深表歉意:$
已解决一个构造函数调用另一个构造函数的问题。
感谢大家的帮助,对于浪费时间表示歉意:)
最佳答案
有人定义了构造函数和析构函数但没有复制构造函数。是被销毁的拷贝弄乱了计数。关注rule of three .
关于c++ - 析构函数好像叫 'early',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4549978/
我开始考虑在我 future 的项目或重构中实现控制反转容器,我想知道在正确设计依赖项时哪些原则(除了 GoF 模式)可能需要牢记在心。假设我需要构建一个简单的控制台应用程序,如果它可以访问互联网,它
假设我有一个 RxC contingency table 。这意味着有 R 行和 C 列。我想要一个维度为 RC × (R + C − 2) 的矩阵 X,其中包含行的 R − 1 “主效应”以及列的
我正在尝试使用 DKMS 为正在运行的内核 (4.4) 构 build 备树覆盖。我天真的 Makefile 如下: PWD := $(shell pwd) dtbo-y += my-awsome-o
我有一个 sencha touch 项目。我是用 phonegap 2.9 构建的,并且可以正常工作 device.uuid 返回到设备 ID。当我尝试使用 3.1 device.uuid 构建时抛出
我在安装了 Xcode 4.5.1 的 Mt Lion 上运行。 默认情况下,当我构建并部署到 iOS 5.1 设备时,显示会在我旋转设备时旋转,但当我部署到 iOS 6 模拟器或运行 iOS 的 i
我正在尝试使用 Google Analytics Reporting API v4 构建多折线图。 一张图表,其中我按每天的 session 计数为每个设备(台式机/平板电脑/移动设备)设置了一条线。
我一生都无法使用 xcode 组织者“自动设备配置”中的“团队配置配置文件”在 xcode 4.0.1 中将我的应用程序构建到我的 iPad 上。 该应用程序完美地构建到模拟器,但当我构建到 iPad
我是一名优秀的程序员,十分优秀!