公司的代码 我不懂 顺便考考大家

weiwenyulai 2013-10-16 08:41:19
出于保密考虑就不贴原来的代码了 问题都在注释里 谢谢~~
A.h文件声明如下
class A{
public:
A();
~A();
static A* shareA();
std::string str;
};

A.cpp文件定义如下
static A* pa = NULL; //这里为何要设 static 有什么优势吗??
A::A(){
str = "sch";
}
A::~A(){

std::cout<<"~~AAA";//为什么不需要delete pa所指的对象?? 而且整个程序运行过程中始终不见这个析构函数的执行 很奇怪?
getchar();
}

A* A::shareA()
{
if(pa == NULL)
{
pa = new A;

}
return pa;
}


某个.cpp文件这样写
const char* pch ="";
pch = A::shareA()->str.c_str();
...全文
459 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
bedynamic 2013-10-17
  • 打赏
  • 举报
回复
引用 7 楼 max_min_ 的回复:
没有delete 应该是在整个过程中,对象都会使用的!就没有delete也无伤大雅,只是习惯不太好而已! 至于5楼说的内存泄露,不敢苟同! 为什么用static话,局部代码看不出来,可能是1楼说的原因!
引用 8 楼 zmlovelx 的回复:
这个析构是public的有点危险呀。
引用 10 楼 akirya 的回复:
1 static 是防止跟其他文件的pa重名 2 内存泄漏了
  • 打赏
  • 举报
回复
1 static 是防止跟其他文件的pa重名 2 内存泄漏了
stereoMatching 2013-10-17
  • 打赏
  • 举报
回复
还有更简单的

A* A::shareA()
{
    static A pa;
    return &pa;
}
stereoMatching 2013-10-17
  • 打赏
  • 举报
回复
修正一些地方

namespace
{
  std::unique_ptr<A> pa;
}
 
A* A::shareA()
{
    if(pa == nullptr)
    {        
        pa.reset(new A);
    }
    return pa.get();
}
stereoMatching 2013-10-17
  • 打赏
  • 举报
回复
看来就只有一个实例而已,不希望memory leak的话就用std::unique_ptr吧 不支援c++11可以用boost::scoped_ptr,都不行大不了自己写一个

static std::unique_ptr<A> pa;
//same as
/*
namespace
{
  std::unique_ptr<A> pa;
}
*/

A* A::shareA()
{
    if(pa == NULL)
    {        
        pa.reset(new A);
    }
    return pa.get();
}
这里名字取shareA是挺怪的 让users误以为该自己负责reference count的部分
lin5161678 2013-10-17
  • 打赏
  • 举报
回复
引用 7 楼 max_min_ 的回复:
没有delete 应该是在整个过程中,对象都会使用的!就没有delete也无伤大雅,只是习惯不太好而已! 至于5楼说的内存泄露,不敢苟同! 为什么用static话,局部代码看不出来,可能是1楼说的原因!
的确始终存在一个指针指向这个对象 不过 这个对象最终没有由程序自己做delete 释放内存 而是 指望操作系统做资源回收的工作 这种现象已经可以被称之为 内存泄露了
帅得不敢出门 2013-10-17
  • 打赏
  • 举报
回复
这个析构是public的有点危险呀。
SKATE11 2013-10-17
  • 打赏
  • 举报
回复
#include <iostream> using namespace std; class A { public: A(); ~A(); char * GetCurChar(); static char* str; static int count; }; A::A() { count++; cout<<"实例化第"<<count<<"个对象"<<endl; } A::~A() { count--; if(count == 0) { delete[] str; cout<<"释放字符串空间 最后一个实例化对象析构"<<endl; } cout<<"剩余"<<count<<"个对象"<<endl; } char* A::GetCurChar() { if(str == NULL) { str = new char[1024]; strcpy(str,"hello world!\n"); cout<<"分配内存\n"<<endl; } return str; } //********************************************************main********************************************// int A::count = 0; char *A::str = NULL; int main() { A a1; cout<<a1.GetCurChar()<<endl; A a2; cout<<a2.GetCurChar()<<endl; A a3; cout<<a3.GetCurChar()<<endl; A a4; cout<<a4.GetCurChar()<<endl; A a5; cout<<a5.GetCurChar()<<endl; A a6; cout<<a6.GetCurChar()<<endl; return 0; }
SKATE11 2013-10-17
  • 打赏
  • 举报
回复
我现在手上也有一份同样模式的代码 类里面的static 成员变量是所有实例化对象所共享的 而且代码中也只为这个静态变量分配了一份内存 要是把对它的析构放到析构函数里面就会出问题 当一个对象析构 那么先前实例化出来的对象就没法用了
weiwenyulai 2013-10-17
  • 打赏
  • 举报
回复
引用 10 楼 akirya 的回复:
1 static 是防止跟其他文件的pa重名 2 内存泄漏了
static A * pa = NULL 这个是在另一个.CPP文件定义的全局变量,我百度static 如果用来声明全局变量,那么这个全局变量的作用域只能是这个.cpp文件. 这里的作用是不是像百度上面说的, 还有这个是游戏客户端的部分代码来的
SKATE11 2013-10-17
  • 打赏
  • 举报
回复
引用 12 楼 SKATE11 的回复:
这个不能用析构函数来释放内存的 那样每个对象析构一次释放一次 但是shareA()里面只分配了一份 会出问题的 最好弄个计数器计算实例化对象的个数
++++
ri_aje 2013-10-17
  • 打赏
  • 举报
回复
这个单利实现(如果算是单利的话)少见,构造和析构都是公有的,没法控制对象个数啊。如果全靠使用者自律的话,还用sharedA干嘛,直接都走pa不是更省事。
2861015754 2013-10-17
  • 打赏
  • 举报
回复
引用 11 楼 bedynamic 的回复:
[quote=引用 7 楼 max_min_ 的回复:] 没有delete 应该是在整个过程中,对象都会使用的!就没有delete也无伤大雅,只是习惯不太好而已! 至于5楼说的内存泄露,不敢苟同! 为什么用static话,局部代码看不出来,可能是1楼说的原因!
引用 8 楼 zmlovelx 的回复:
这个析构是public的有点危险呀。
引用 10 楼 akirya 的回复:
1 static 是防止跟其他文件的pa重名 2 内存泄漏了
[/quote]
SKATE11 2013-10-17
  • 打赏
  • 举报
回复
这个不能用析构函数来释放内存的 那样每个对象析构一次释放一次 但是shareA()里面只分配了一份 会出问题的 最好弄个计数器计算实例化对象的个数
max_min_ 2013-10-16
  • 打赏
  • 举报
回复
没有delete 应该是在整个过程中,对象都会使用的!就没有delete也无伤大雅,只是习惯不太好而已! 至于5楼说的内存泄露,不敢苟同! 为什么用static话,局部代码看不出来,可能是1楼说的原因!
AnYidan 2013-10-16
  • 打赏
  • 举报
回复
公司里有的代码,架构写得的确不错, 有的代码写得也的确不怎么样 当然,也许自己水平有限,不排除有眼不识泰山
lin5161678 2013-10-16
  • 打赏
  • 举报
回复
存在内存泄露 用内存泄露工具检测是不会通过的 代码的意思也就是 反正这个对象才整个程序运行期都只会new一次 泄露就泄露吧 无所谓 这点内存花得起 或者 反正都是 整个程序运行期都得存在的东西 没必要做delete 让操作系统自己delete就行 鄙视这推卸责任的心态
碼上道 2013-10-16
  • 打赏
  • 举报
回复
A::~A(){
 
    std::cout<<"~~AAA";//为什么不需要delete pa所指的对象??  而且整个程序运行过程中始终不见这个析构函数的执行  很奇怪?
    getchar();
}
如果在对象析构里删除,会有问题,因为不知道这个对象是不是最后一个对象,可能有其他地方用到了这个单实例对象,一般来说,会有一条特别的成员函数用于删除,或者在程序结束前再删除。
mujiok2003 2013-10-16
  • 打赏
  • 举报
回复
引用 2 楼 weiwenyulai 的回复:
[quote=引用 1 楼 mujiok2003 的回复:] 单例模式(singleton pattern)
我百度了一下 其中 从具体实现角度来说,就是以下三点:一是单例模式的类只提供私有的构造函数,二是类定义中含有一个该类的静态私有对象,三是该类提供了一个静态的共有的函数用于创建或获取它本身的静态私有对象 明显我所提供的代码不满足第一 二点. static A* pa = NULL; //这里的pa 不属于类成员 是另一个文件的全局变量的 是不是我公司的代码不规范??? 还有像这种例子非常多 为什么从来没见过有析构函数调用的?[/quote] 只要A的用户都是通过A:::shareA()来用使用的, 这是就单例。你说的其它条件只是借助C++语法来保证单例的唯一性。
weiwenyulai 2013-10-16
  • 打赏
  • 举报
回复
引用 1 楼 mujiok2003 的回复:
单例模式(singleton pattern)
我百度了一下 其中 从具体实现角度来说,就是以下三点:一是单例模式的类只提供私有的构造函数,二是类定义中含有一个该类的静态私有对象,三是该类提供了一个静态的共有的函数用于创建或获取它本身的静态私有对象 明显我所提供的代码不满足第一 二点. static A* pa = NULL; //这里的pa 不属于类成员 是另一个文件的全局变量的 是不是我公司的代码不规范??? 还有像这种例子非常多 为什么从来没见过有析构函数调用的?
加载更多回复(1)

69,372

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧