小编Kad*_*mir的帖子

共享的指针传染媒介,在清除传染媒介以后的记忆问题

我意识到在调用vector.clear()哪个持有共享指针之后,shared_ptr没有释放拥有的对象的析构函数.

代码示例如下所示.即使vector.clear()被调用,在共享指针之后调用的析构函数超出了范围.我的问题是 - 我是否必须通过重置它们来手动删除向量内的所有智能指针?有没有更简单的方法可以提供建议?

Output :   

constructor
I am here
destructor

Code:

#include <vector>
#include <iostream>
#include <memory>

using namespace std;

class A
{
public:
    A(){cout << "constructor" << endl;};
    ~A(){cout << "destructor"  << endl;};
};

int main( )
{
    shared_ptr<A> sharedptr (new A);
    std::vector<shared_ptr<A> > test;
    test.push_back(sharedptr);

    test.clear();
    cout << "I am here" << endl;
}
Run Code Online (Sandbox Code Playgroud)

c++ memory smart-pointers vector

23
推荐指数
2
解决办法
4万
查看次数

如何通过openssl检索ssl证书的issuer替代名称

我可以得到主题替代名称

 X509_NAME_get_text_by_NID(X509_get_subject_name(x), NID_subject_alt_name, hc->https_domain_name, 256)
Run Code Online (Sandbox Code Playgroud)

使用相同的方法将2.参数更改为NID_issuer_alt_name我希望获得发行者名称;

X509_NAME_get_text_by_NID(X509_get_subject_name(x), NID_issuer_alt_name, hc->https_ca_name, 256);
Run Code Online (Sandbox Code Playgroud)

但相反,我得到一个空字符串.如何正确检索发行人替代名称?

c ssl openssl

7
推荐指数
1
解决办法
6885
查看次数

使用Eclipse GUI远程调试C++应用程序

我按照这个链接中的步骤操作, 并设法从命令提示符调试从我的Windows机器中驻留在linux主机中的二进制文件.

我在linux中有gdbserver,我在windows中使用mingw安装了gdb.正如我所说,我可以在Windows中提示"目标远程xxxx:10000测试"命令并调试我的测试应用程序.

我的问题是我不能用eclipse gui做同样的事情,在我看来它有按钮的音调,选项,但它们对我没有任何意义.

我选择debug_configurations - > C/C++远程应用程序(唯一一个允许我输入linux机器的ip/port),在"Main"选项卡中连接我正在输入我的linux ip.在Debugger选项卡下的同一菜单中,我输入了我的窗口的gdb路径和gdbserver端口.

在完成所有这些之后,我相信我已经为eclipse提供了足够的信息来连接gdb服务器,但它永远不够用于eclipse.我通过使用--debug启动gdbserver来检查gdbserver日志,gdbserver永远不会被触发,它不会写入一行日志.Eclipse甚至不会启动连接.但相反,它给我一个错误,如"文件上传时出错".这对我没有意义.

我正在使用"Eclipse版本:Juno Service Release 2".任何帮助将不胜感激 .

c++ eclipse linux windows

6
推荐指数
1
解决办法
1万
查看次数

从所有项目访问常规用法类

在我们的应用程序中,有一般使用的类(例如,一个包含项目配置参数的类),如下所示.

class DB{   
public:
int projectVersion
int somethingSoMuchImportantAllOverTheProject
};
extern DB* pDB;
Run Code Online (Sandbox Code Playgroud)

因为所有其他类都将使用此类,所有这些类都需要以某种方式访问​​它.我们的解决方案是放置"extern DB*pDB;" 在其头文件下,无论谁需要它,都可以在包含标题后访问它.我想也许有更好的解决方案,并希望得到你的想法这个一般情况.

c++

5
推荐指数
1
解决办法
72
查看次数

将std :: ifstream读取到行向量后,有些字节丢失了

为了将我从输入文件中读取的内容复制到vector,我std::copy()按照将std :: ifstream读取到行向量的建议使用.

如果我使用以下问题会发生:

std::copy(std::istream_iterator<unsigned char>(inputfile),
          std::istream_iterator<unsigned char>(),
          std::back_inserter(myVector));
Run Code Online (Sandbox Code Playgroud)

myVector变量中缺少我文件的第16个字节.

但是,如果我使用以下代码:

inputfile.read((char*)&myVector[0], sizeof(int)*getfilesize(nameOfFile));
Run Code Online (Sandbox Code Playgroud)

然后该字节不再丢失.

我试图解析WAV文件,我在这上面浪费了太多时间,我希望我能从中学到新东西.你能否告诉我上面代码的第一个版本有什么问题?

c++ istream-iterator

5
推荐指数
2
解决办法
1341
查看次数

在D中的关联数组中查找最大值元素

在阅读有关范围的文档后,我相信任何std.algorithm函数都应该适用于包含关联数组的任何容器,

但是下面的代码失败了:

double[double] freqIntensity;
foreach (complexval; resultfft)
{
    freqIntensity[arg(complexval)]++;
}
minPos!("a > b")(freqIntensity);
Run Code Online (Sandbox Code Playgroud)

有错误:

src\main.d(56): Error: template std.algorithm.minPos does not match any function template declaration. Candidates are:
C:\D\dmd2\windows\bin\..\..\src\phobos\std\algorithm.d(6321):        std.algorithm.minPos(alias pred = "a < b", Range)(Range range) if (isForwardRange!(Range) && !isInfinite!(Range) && is(typeof(binaryFun!(pred)(range.front, range.front))))
src\main.d(56): Error: template std.algorithm.minPos(alias pred = "a < b", Range)(Range range) if (isForwardRange!(Range) && !isInfinite!(Range) && is(typeof(binaryFun!(pred)(range.front, range.front)))) cannot deduce template function from argument types !("a > b")(double[double])
src\main.d(56): Error: template instance minPos!("a > b") errors instantiating …
Run Code Online (Sandbox Code Playgroud)

d

5
推荐指数
1
解决办法
143
查看次数

如何从vector <char>中复制一个整数

我现在正在使用wav文件,我正在解析它们.我现在不想使用库.我用fstream打开wav文件并将所有数据读取到vector.现在我想解析wav文件头.例如,我想获得第4到第8个字节之间的文件大小.我想将它分配给一个整数.我很容易用memcpy完成这个.但是因为它是C++我不想使用memcpy.我最终得到的解决方案:

std::vector<unsigned char>::iterator vectorIte = soundFileDataVec.begin();
vawParams.totalfilesize = 0;
//Since it is little endian I used reverse_copy
std::reverse_copy(vectorIte + 4, vectorIte + 7, (unsigned char*)&vawParams.totalfilesize);
Run Code Online (Sandbox Code Playgroud)

我不满意(unsigned char*)强制转换为整数指针.我怀疑有比我更好的方法.能告诉我一个更好的方法吗?

c++ stdvector

4
推荐指数
1
解决办法
1052
查看次数

对于循环与使用相对较旧的编译器的标准库算法

我知道当代码中没有任何令人困惑的for循环时,代码会更好.在可能的情况下重用标准库算法总是好的.但是,我发现迭代器和算法的语法看起来真的很混乱.

我想从我当前的项目中给出一个真实的例子:我想将内容复制vector<vector<QString>> invector<QVariant> out.我看不出以下区别:

for (int i = 0; i < in[0].size(); i++ ) 
{ 
    if(in[0][i].isNull() || in[0][i].isEmpty() ) 
        out[i] = "NONE";
    else
        out[i] = in[0][i];
}
Run Code Online (Sandbox Code Playgroud)

然后:

std::transform(in[0].begin(), in[0].end(), out.begin(), [](const QString& a)->QVariant{
    if(a.isNull() || a.isEmpty() ) 
        return "NONE";
    else
        return a;
}); 
Run Code Online (Sandbox Code Playgroud)

由于我们有visual studio 2012,我甚至必须输入我的lambda的返回值.使用范围之后:

in[0].map!( a => a.isNull() || a.isEmpty() ? "NONE" : a ).copy(out);
Run Code Online (Sandbox Code Playgroud)

在D语言中,我根本无法忍受std::transform上面的代码.我甚至不确定它是否比基本for循环更好.我的问题是:使用std::transform上面的代码比for循环好吗?

c++ algorithm c++11

4
推荐指数
1
解决办法
337
查看次数

Qt 画一个带孔的圆环/圆

我需要用 QPainter 画一个圆圈。当我使用 drawEllipse 函数时:

void UserClass::Draw(QPainter &painter) {

    painter.save();
    painter.setBrush( GetColor() );
    QPoint centerPosition = GetCenterPosition();
    painter.drawEllipse( centerPosition, m_CircleOuterRadius, m_CircleOuterRadius);
    painter.setBrush(QColor(0, 0, 0, 0));
    painter.drawEllipse( centerPosition, m_CircleInnerRadius, m_CircleInnerRadius);
    painter.restore();  
}
Run Code Online (Sandbox Code Playgroud)

不幸的是结果不是我想要的。我想让内圈不被填满。这就是为什么我将 alpha 值设置为零,但当然它不起作用。我怎么能有一个圆,直到 qt 达到某个半径?

在此处输入图片说明

c++ qt qpainter

4
推荐指数
1
解决办法
2980
查看次数

从参数的返回类型中推导出函数返回类型

我有下面的代码

template<typename U, typename F >
U GetListAndSearchName( F listGetter, const std::string& stringName )
{
    std::vector<UserType> newList;
    for ( size_t i = 0; i < myList.size(); i++)
    {
        const std::vector<U>& list = listGetter(myList[i]);
        for ( size_t i = 0; i < list.size(); i++ )
        {
            if ( list[i]->GetName() == stringName )
                return list[i];
        }
    }
    return U();
}
Run Code Online (Sandbox Code Playgroud)

甚至U存在于我的函数指针的返回类型中,它是模板参数F(我以后使用std :: mem_fn来创建它可能也是std :: function)当前我需要显式地将U的类型传递给编译器.

如何让我的旧Vs2010编译器推断出U的类型?

c++ templates visual-studio-2010 c++03

3
推荐指数
1
解决办法
92
查看次数