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 : 这个是绝对不允许的
|