查看: 1983|回复: 6

如何new 出osg::Geomtry的数组?

[复制链接]

该用户从未签到

发表于 2009-7-16 18:28:49 | 显示全部楼层 |阅读模式
osg::Geometry * pGeom = new osg::Geometry[5];
这样编译器出现错误提示啊,请问怎么解决

该用户从未签到

发表于 2009-7-16 22:50:17 | 显示全部楼层
基本的C++语法错误。
osg::Geometry * pGeom = new osg::Geometry;
或者

osg::Geometry * pGeoms[5];
for ( int i=0; i<5; ++i )
{
    pGeoms[i] = new osg::Geometry;
}

该用户从未签到

 楼主| 发表于 2009-7-17 22:16:10 | 显示全部楼层
语法错误?
标准C++规定不能new数组吗?
为什么可以 char*pText = new char[100];
就不可以new出一个类的数组?

以下代码在vc6.0中通过,但是vs2005不能通过

#include "stdafx.h"

class CTest
{
public:
        CTest(){}
private:
        virtual ~CTest(){}
};

int main(int argc, char* argv[])
{
        char * pText = new char[100];
        CTest * pTest = new CTest[100];

        return 0;
}

该用户从未签到

发表于 2009-7-18 07:58:50 | 显示全部楼层
本帖最后由 wontor 于 2009-7-18 08:02 编辑

CTest析构函数类型换成public试试

该用户从未签到

发表于 2009-7-18 09:08:28 | 显示全部楼层
C++当然可以新分配数组。而正如wontor所说,这里是由于析构函数非公有而产生的错误。

正如我们不能直接构建一个“Ctest test”一样,当我们执行
CTest * pTest = new CTest[100];
时,我们是在尝试构建100个CTest对象,由于它的析构函数不能公共调用,所以会出现语法错误。

这个时候应当选择构建指针的数组,即:
osg::Geometry** geoms = new osg::Geometry*[5];

或者更清晰一点的写法:
typedef osg::Geometry* GeometryType;
GeometryType geoms = new GeometryType[5];

注意这里分配得到的5个Geometry*对象都是没有经过分配的,仍需要对它们依次分配空间

至于VC6为什么能通过,那是VC6的不严密所致——它是一个已经被证明是有严重问题的编译器

该用户从未签到

 楼主| 发表于 2009-7-18 17:39:13 | 显示全部楼层
谢谢array和wonter。
我知道是析构函数导致的。
问题是
【1】 CTest * pTest = new CTest[100]; 析构函数不能公共调用,所以会出现语法错误
【2】 CTest * pTest = new CTest; 析构函数也不能公共调用,但是没有出现语法错误啊,而且这种写法在OSG中经常出现,像osg::Geometry * pGeom = new osg::Geometry

为什么要构建指针的数组,如果真要使用new出来的对象的话,我应该可以通过&pTest[3]这样的形式来获取对象的地址吧?抱歉对此问题比较纠结。。。

该用户从未签到

发表于 2009-7-19 08:39:15 | 显示全部楼层
CTest test;
是作为栈对象处理的,在生命周期开始时自动分配空间,结束时自动销毁。


CTest* test = new CTest;
是作为堆对象处理的,当用户使用new操作符时分配空间,使用delete时销毁。

因此CTest * pTest = new CTest是不会自动析构的,换句话说,如果用户始终没有执行过delete函数,那么这就叫做内存泄露了。而osg的ref_ptr机制会负责自动收集并统一析构这些对象,此时delete动作是成员内部调用的,不会产生错误;并且良好地保护了参与场景运算的对象。

详细地阅读一些C++的基本知识会对您的学习有更大帮助。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表