由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - C++如何在程序结束的时候不调用析构函数
进入Programming版参与讨论
1 (共1页)
b***i
发帖数: 3043
1
最近遇到一个好玩的任务。在个unit test里需要一个进程产生一个资源给主进程用,
正好我们有一个class,就用了。
int main(...){
...
Good a = GetGood(...);
return 0;
}
结果这个变量析构的时候把那个资源给删了。但是我不希望删掉。咋办呢?
有人建议说,那就死循环吧。我想,那太占CPU了,就sleep吧。也行吧。
int main(...){
...
Good a = GetGood(...);
sleep(1000seconds);
return 0;
}
审查代码的说,你不能用std::mem:forget吗?他忘记了可这是C++啊,以为是rust呢。
后来有人提了一个挺巧的方法,我也想出一个。大家有什么办法?就是我们要故意内存
泄漏。当然,我们的系统,主进程结束的时候就结束了,不会有内存泄漏。而且,这只
是一个测试,临时泄漏一下内存也没什么大问题。
m*****n
发帖数: 3575
2
rust什么时候能替代C++?
如果rust不行,Objective-C能不能顶上?
盹盹盹~~
W***u
发帖数: 1
3
get_good()返回pointer就可以造成memory leak
f*******t
发帖数: 7549
4
为啥不让子进程等着,接到主进程的signal再退出
l****0
发帖数: 1032
5
可以定义一个析构函数,不做任何事情吗?default的会删掉,自定义一个不删东西的
就好吧
b***i
发帖数: 3043
6
是得,我就是这么做的,
new Good(GetGood(...));
return 0;

【在 W***u 的大作中提到】
: get_good()返回pointer就可以造成memory leak
b***i
发帖数: 3043
7
可以这么做,有点复杂啊。主要是我们主测试进程如果结束了,这个子进程会自动结束
,所以死循环就可以了。就没去做signal。

【在 f*******t 的大作中提到】
: 为啥不让子进程等着,接到主进程的signal再退出
b***i
发帖数: 3043
8
主要是得全盘抄写。否则如果继承原来的类,析构必定会调用基类的析构。

【在 l****0 的大作中提到】
: 可以定义一个析构函数,不做任何事情吗?default的会删掉,自定义一个不删东西的
: 就好吧

o**o
发帖数: 3964
9
这算什么memory泄露 你们在开玩笑吗

【在 b***i 的大作中提到】
: 是得,我就是这么做的,
: new Good(GetGood(...));
: return 0;

b***i
发帖数: 3043
10
不会吗?我觉得会泄漏内存啊,就是每测试一次就增加一点空间来存储这个类的内容。
当然那个资源还是会释放,因为那个主进程知道这个资源的存在。只是这个生成和销毁
资源的类本身浪费了内存。

【在 o**o 的大作中提到】
: 这算什么memory泄露 你们在开玩笑吗
A***g
发帖数: 1816
11
用指针就完了呗,不过主进程那边要负责清理,而且其它的exception情况要想到这个
指针需要清理。这是老C++的标准用法。
b***y
发帖数: 14281
12
尼玛现在小朋友都这么不学无术了?C++基本常识,不希望被析构就应该返回reference
给主程序接着。你非要泄漏内存干什么?泄漏的内心谁也access 不了,有什么意义?

【在 b***i 的大作中提到】
: 最近遇到一个好玩的任务。在个unit test里需要一个进程产生一个资源给主进程用,
: 正好我们有一个class,就用了。
: int main(...){
: ...
: Good a = GetGood(...);
: return 0;
: }
: 结果这个变量析构的时候把那个资源给删了。但是我不希望删掉。咋办呢?
: 有人建议说,那就死循环吧。我想,那太占CPU了,就sleep吧。也行吧。
: int main(...){

b***i
发帖数: 3043
13
一般的程序在析构这个类的变量时,是希望销毁这个类在构造是创造的一个重要的资源
(比如,是一个系统内可以访问的而文件)。
但是我的测试如果也这样做了,这个子进程结束的时候,这个文件消失了,而那么多测
试要用这个文件,就会出错。
怎么办?有的审查者的建议就是死循环,子进程不退出。另一个建议是让这个类的变量
不被销毁(析构函数不被调用)。

reference

【在 b***y 的大作中提到】
: 尼玛现在小朋友都这么不学无术了?C++基本常识,不希望被析构就应该返回reference
: 给主程序接着。你非要泄漏内存干什么?泄漏的内心谁也access 不了,有什么意义?

b***i
发帖数: 3043
14
对,我后来想到的就是用指针。智能指针用多了,忘记了C++可以用裸指针。

【在 A***g 的大作中提到】
: 用指针就完了呗,不过主进程那边要负责清理,而且其它的exception情况要想到这个
: 指针需要清理。这是老C++的标准用法。

h****e
发帖数: 2125
15
shared_ptr可以设deleter arg,你给个noop的deleter它就不删了

【在 b***i 的大作中提到】
: 对,我后来想到的就是用指针。智能指针用多了,忘记了C++可以用裸指针。
b***i
发帖数: 3043
16
具体写很复杂吧。裸指针一行搞定, 就是new。
另一个办法是exit(0);这个不调用栈上变量的析构函数。

【在 h****e 的大作中提到】
: shared_ptr可以设deleter arg,你给个noop的deleter它就不删了
h****e
发帖数: 2125
17
stackoverflow上很老的问题了:
https://stackoverflow.com/questions/20131877/how-do-you-make-stdshared-ptr-
not-call-delete

【在 b***i 的大作中提到】
: 具体写很复杂吧。裸指针一行搞定, 就是new。
: 另一个办法是exit(0);这个不调用栈上变量的析构函数。

b***i
发帖数: 3043
18
说的就是很负杂啊,本来就可以很简单
new Good(GetGood());
return 0;
或者
auto t=GetGood();
exit(0);
return 0;
非得
auto t=GetGood();
std::shared_ptr(&t, std::shared_ptr{});
return 0;

【在 h****e 的大作中提到】
: stackoverflow上很老的问题了:
: https://stackoverflow.com/questions/20131877/how-do-you-make-stdshared-ptr-
: not-call-delete

h****e
发帖数: 2125
19
如果class Good的copy ctor是private怎么办,你的solution还能用吗?
叔好几年不写C++了,现在自觉很生疏

【在 b***i 的大作中提到】
: 说的就是很负杂啊,本来就可以很简单
: new Good(GetGood());
: return 0;
: 或者
: auto t=GetGood();
: exit(0);
: return 0;
: 非得
: auto t=GetGood();
: std::shared_ptr(&t, std::shared_ptr{});

b***i
发帖数: 3043
20
Copy 不行就Move,都不行的话就谁都做不了了(比如share_ptr)。我们自己写的代码
不会这样的。
GetGood就是描述一个用来构造那个资源的一个过程。这个过程的结果就是得到一个可
以用来控制这个资源销毁的变量。这个变量的类型就是Good。当然,这个结果其实还被
其他的模板包含了,其实是
HigherType GetGood(std::string path) {
...
return api_call_create(path);
}
都做不了
auto t = GetGood(..);
也做不了。虽然本质上RVO,但是从语法上需要Copy.

【在 h****e 的大作中提到】
: 如果class Good的copy ctor是private怎么办,你的solution还能用吗?
: 叔好几年不写C++了,现在自觉很生疏

h****e
发帖数: 2125
21
用no-op deleter就不需要copyable:“
MyType t;
nasty_function(std::shared_ptr(&t, [](MyType*){}));


【在 b***i 的大作中提到】
: Copy 不行就Move,都不行的话就谁都做不了了(比如share_ptr)。我们自己写的代码
: 不会这样的。
: GetGood就是描述一个用来构造那个资源的一个过程。这个过程的结果就是得到一个可
: 以用来控制这个资源销毁的变量。这个变量的类型就是Good。当然,这个结果其实还被
: 其他的模板包含了,其实是
: HigherType GetGood(std::string path) {
: ...
: return api_call_create(path);
: }
: 都做不了

b***i
发帖数: 3043
22
我那个函数本来就返回Good,你咋搞成share_ptr

【在 h****e 的大作中提到】
: 用no-op deleter就不需要copyable:“
: MyType t;
: nasty_function(std::shared_ptr(&t, [](MyType*){}));
: ”

b***i
发帖数: 3043
23
发现C++17里,new一个函数的返回值不需要Copy
/***************************************************************************
***
Welcome to GDB Online.
GDB online is an online compiler and debugger tool for C, C++, Python, Java,
PHP, Ruby, Perl,
C#, VB, Swift, Pascal, Fortran, Haskell, Objective-C, Assembly, HTML, CSS,
JS, SQLite, Prolog.
Code, Compile, Run and Debug online from anywhere in world.
****************************************************************************
***/
#include
#include
using namespace std;
class Test {
private:
int y;
private:
Test(const Test&)= delete;
Test& operator=(const Test&) = delete;
Test(Test&&) = delete;
Test& operator=(Test&&) = delete;
public:
Test(int x):y(x){
cout<<"Constructed"< }
~Test(){
cout<<"Destructed"< }
};
Test Get(int a){
return Test(a);
}
int main()
{
new Test(Get(3));
cout<<"Hello World"< return 0;
}
或者exit(0);
int main()
{
Test a(Get(3));
cout<<"Hello World"< exit(0);
return 0;
}
但是如果不用变量来保存函数返回值
int main()
{
Get(3);
cout<<"Hello World"< exit(0);
return 0;
}
那么结果就直接销毁。这样的话exit(0);也不起作用。
Constructed
Destructed
Hello World

【在 h****e 的大作中提到】
: 如果class Good的copy ctor是private怎么办,你的solution还能用吗?
: 叔好几年不写C++了,现在自觉很生疏

f*****4
发帖数: 1
24
死循环(while)里面套个 sleep 1s, 就不会占用太多cpu.
再加个全局变量之类的,帮助退出循环

【在 b***i 的大作中提到】
: 最近遇到一个好玩的任务。在个unit test里需要一个进程产生一个资源给主进程用,
: 正好我们有一个class,就用了。
: int main(...){
: ...
: Good a = GetGood(...);
: return 0;
: }
: 结果这个变量析构的时候把那个资源给删了。但是我不希望删掉。咋办呢?
: 有人建议说,那就死循环吧。我想,那太占CPU了,就sleep吧。也行吧。
: int main(...){

f*****4
发帖数: 1
25
这就是 现在 c++ 现在排名 干不过 python 的原因之一

【在 h****e 的大作中提到】
: 如果class Good的copy ctor是private怎么办,你的solution还能用吗?
: 叔好几年不写C++了,现在自觉很生疏

b***i
发帖数: 3043
26
有的建议说需要一个通信机制来退出,但是我这是另一个进程啊。进程通信,有点麻烦
。我们这个系统的特点是,主进程结束的时候,子进程也就结束了。所以等在那里也可
以。
我也是这么想的,但是审查的不喜欢这样sleep。

【在 f*****4 的大作中提到】
: 死循环(while)里面套个 sleep 1s, 就不会占用太多cpu.
: 再加个全局变量之类的,帮助退出循环

b***i
发帖数: 3043
27
我觉得python使用者很多是交叉领域的,比如我在石油公司就有同事是化工,石油,水
利背景,用python来描述商业逻辑的。具体计算是C++写的。Python更接近这些其他领
域的工程师。C++更像是用来写工具的。干不过没关系,还活着就行。

【在 f*****4 的大作中提到】
: 这就是 现在 c++ 现在排名 干不过 python 的原因之一
h****e
发帖数: 2125
28
你别再混石油啦,我感觉你这帮同事的C++水平也不咋地
刷刷题去Austin的脸家拿点大包吧

【在 b***i 的大作中提到】
: 我觉得python使用者很多是交叉领域的,比如我在石油公司就有同事是化工,石油,水
: 利背景,用python来描述商业逻辑的。具体计算是C++写的。Python更接近这些其他领
: 域的工程师。C++更像是用来写工具的。干不过没关系,还活着就行。

b***i
发帖数: 3043
29
耐何人家入职早。等我再新开一个题目,讲讲另一个项目里的C++问题。

【在 h****e 的大作中提到】
: 你别再混石油啦,我感觉你这帮同事的C++水平也不咋地
: 刷刷题去Austin的脸家拿点大包吧

t**8
发帖数: 4527
30
显然是用信号等待
标准的 握手程序
除此之外,都是瞎扯
你的程序要等待别程序运行完给你个信号再关掉
这不是最初级的同步码
C++ 后来加的这些花里狐骚的东西真是吭人
C. 就很好了
你不调 destructor 就是memory leak
这个是绝对不允许的

【在 b***i 的大作中提到】
: 最近遇到一个好玩的任务。在个unit test里需要一个进程产生一个资源给主进程用,
: 正好我们有一个class,就用了。
: int main(...){
: ...
: Good a = GetGood(...);
: return 0;
: }
: 结果这个变量析构的时候把那个资源给删了。但是我不希望删掉。咋办呢?
: 有人建议说,那就死循环吧。我想,那太占CPU了,就sleep吧。也行吧。
: int main(...){

b***i
发帖数: 3043
31
我是要sleep,很简单,等测试完了就析构。但是无奈审查者不同意吗,他们宁愿内存
泄漏。
这个内存泄漏等价于内存驻留,因为原来那个类的主要功能是启动一个进程,然后析构
时关掉这个进程。其实析构时应该决定是否关掉这个进程。可以利用一个构造时的参数
决定。但是这个类太基础了,我懒得改,会有很多人有意见。

【在 t**8 的大作中提到】
: 显然是用信号等待
: 标准的 握手程序
: 除此之外,都是瞎扯
: 你的程序要等待别程序运行完给你个信号再关掉
: 这不是最初级的同步码
: C++ 后来加的这些花里狐骚的东西真是吭人
: C. 就很好了
: 你不调 destructor 就是memory leak
: 这个是绝对不允许的

1 (共1页)
进入Programming版参与讨论