小编Lef*_*ris的帖子

C++ std ::指针删除和分段错误的向量

我有一个指向类的指针向量.我需要打电话给他们的析构函数并释放他们的记忆.因为它们是指针向量vector.clear()不做这个工作.所以我继续这样做:

void Population::clearPool(std::vector<Chromosome*> a,int size)
{
    Chromosome* c;
    for(int j = 0 ;j < size-1;j++)
    {
       c = a.back();
       a.pop_back();
       delete c;
       printf("  %d \n\r",j);
       c = NULL;

    }

}
Run Code Online (Sandbox Code Playgroud)

那里的printf因为我有一个会说话的析构函数,可以看到哪个染色体发生了分段错误.当调用clearPool()并说我们得到100的大小时,它可以在0到100之间的任何染色体中给出分段错误.

我不知道为什么会发生这种情况,也没有办法真正找到错误,因为在使用断点进行调试时,我看到的是它发生在随机染色体上.

我正在使用codeblocks IDE和gdb调试器.发生分段故障时的堆栈跟踪有4个内存地址和一个函数wsncpy().

c++ pointers memory-management segmentation-fault

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

指针算术后释放指针

我的问题非常简单.说我们有:

char* ptr = (char*) malloc(sizeof(char)*SIZE);
ptr+= SIZE/2;
free(ptr);
Run Code Online (Sandbox Code Playgroud)

当我们释放指针时会发生什么?是不确定的操作?它是否释放所有SIZE缓冲区或仅剩余的SIZE/2?在此先感谢您为我消除歧义.

c pointers pointer-arithmetic

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

在windows中为msysgit设置openssh端口

一个简单的问题.我使用msysgit和openSSH作为git客户端.我不想使用其他ssh客户端,如putty.从GIT Bash我已成功连接到我的服务器与ssh -p XXXX到我的服务器.

不幸的是,当我尝试做类似的事情:

git clone git@SERVER:reponame.git 
Run Code Online (Sandbox Code Playgroud)

从Git Bash我得到:

ssh: connect to host SERVER port 22 failed.
Run Code Online (Sandbox Code Playgroud)

如何使用openssh在不同的端口运行msysgit尝试打开的ssh连接?

我知道在linux中这样的东西会出现在/ etc/ssh/ssh_config文件中,但在这种情况下我该如何做呢?提前致谢.

windows git msysgit

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

在GCC下禁止不兼容的指针类型特定警告

在我在GCC下的代码中,我收到了很多关于这两种类型的警告.

warning: passing argument 1 of 'foo' from incompatible pointer type
Run Code Online (Sandbox Code Playgroud)

warning: assignment from incompatible pointer type
Run Code Online (Sandbox Code Playgroud)

我知道通常情况下,这两个是严重的警告,表明代码中存在一些错误.就我而言,无论发生在哪里,我都非常清楚我在做什么,我知道我可以放心地忽略这些警告.(是的,我很确定)

但是现在我的代码已经发展到这样的程度,以至于这些警告掩盖了其他任何事情,实际上隐藏了可能导致我讨厌的错误的潜在警告.所以我决定抑制它们.很快我意识到我不知道怎么做.我的gcc版本是4.4.1,我知道我可以使用:

#pragma GCC diagnostic ignore "-Wname" 
Run Code Online (Sandbox Code Playgroud)

忽略我想要的任何警告.但是从我发现的唯一一个大而全面的海湾合作委员会警告清单中,我似乎无法找到这两个警告.我开始逐一挑选它们并将它们变成错误,以查看由于不兼容的指针类型而导致编译停止的时间,但是无法获得如下所示.

#pragma GCC diagnostic error "-Wimplicit-int"   
#pragma GCC diagnostic error "-Waddress"
#pragma GCC diagnostic error "-Wreturn-type"
           .... //e.t.c.
Run Code Online (Sandbox Code Playgroud)

所以......问题是,是否有人知道这些警告的名称,以便我可以实际禁止它们?

编辑

由于评论中的讨论,我必须澄清一个误解,我曾让我相信我必须禁止警告.我认为在指向结构的指针之间执行显式转换会涉及一些成本(无论多么微不足道).

所以我的想法,我现在意识到是有缺陷的,因为我的程序正在运行并且已经在不同的平台上工作了很长时间,为什么要添加工作来满足编译器?

好吧,我现在意识到了,我正在写这里,以防其他人偶然发现这个话题并且有相同的思路.执行指针的显式类型转换不需要任何成本,优点是:

  • 编译器停止用警告唠叨你
  • 其他人可以知道你故意在那里做演员并且没有犯错误

所以这里是其他任何可能有同样问题的人.

c gcc warnings

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

指向父类的成员函数的函数指针

我一直在尝试理解C++中的函数指针,以便我可以在我的一个项目中成功使用它们.我遇到了逻辑问题.假设我们有两个类:父类和继承父类的子类.

class Parent{
    ...other stuff
   void (Parent::*ptr2func) ();
    ...other stuff
};
Run Code Online (Sandbox Code Playgroud)

然后我们有一个子类:

class Child : public Parent{
       ...other stuff
       void afunc();
       ...other stuff
};
Run Code Online (Sandbox Code Playgroud)

我想将父类的指针连接到子类的afunc()函数.在子类的构造函数中,我尝试这样做:

  Child::Child()
  {
    ptr2func = &Child::afunc;
  }
Run Code Online (Sandbox Code Playgroud)

这返回了一个预期的错误:无法转换void (Child::*)()void (Parent::*)()赋值.

我担心会发生这样的事情.但是我该如何克服这个呢?我不能将父类的成员函数的函数指针链接到子类的成员函数吗?正如您所理解的那样,我试图通过函数指针实现多态性,仅用于实验而不使用虚函数.我一直相信这是可能的.我的错是什么?或者它是不可能的?

c++ function-pointers

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

C++ assert()在没有给出任何错误消息或失败的行的情况下失败

我的代码中有一个奇怪的问题.我有许多分散在代码周围的断言,一切都运行良好.每当断言失败时,我都会收到一条消息,告诉我故障发生的位置.今天我在一个加载文件的函数中写了另一个断言.只是想确保fie存在.一个非常简单的断言.这是相关代码:

//Check that the file exists and can be opened
FILE* f = fopen(filename, "rb");

#ifdef ASSERTIONS_ON
    assert(f!=NULL);//@problem For some reason while all other asserts work, this one just crashes the program without reporting line
#else
    if(f  == NULL)
        return MODEL_LOAD_FILENOTFOUND;
#endif

fclose(f);
Run Code Online (Sandbox Code Playgroud)

我知道这并没有多大帮助,只是想展示我的问题所在.我的操作系统是Windows 7.编译器是GCC.我从Windows获得的错误消息是通常的运行时错误但没有行报告:

"该应用程序已要求Runtime以不寻常的方式终止它.请联系应用程序的支持团队以获取更多信息"

可能是什么问题呢?什么可能导致断言失败只是请求终止而不报告它发生的行,而在相同的代码中的每个其他情况下它按预期工作?在此先感谢您的帮助!

c c++ assert

2
推荐指数
1
解决办法
470
查看次数

线程开始时Winapi错误87

我有一个困扰我一段时间的问题.我的项目中的每个子线程都正确运行并执行它应该执行的操作,但启动线程并将Last Error设置为87.

87表示根据Win32系统错误的无效参数.由于LastError是特定于线程的,并且因为从ThreadProc函数的第一行开始,它似乎被设置为我唯一可以推断的是ThreadProc函数本身在语法上是错误的(?).

我的操作系统是Windows 7 x64和编译器是gcc 4.6.2版我已这在我的系统错误87组启动子线程一个小例子程序.

#include <windows.h>

DWORD WINAPI THREAD_FUNCTION(LPVOID t)
{
    printf("In the child thread: Last Error is %lu\n",GetLastError());
    return 0;
}

typedef struct thread_data
{
    //just an id for example's sake
    uint32_t id;
}thread_data;

int main()
{
    HANDLE thread;
    thread_data d;
    d.id = 1;
    printf("Main thread start:Last error is %lu\n",GetLastError());
    //create the thread
    thread = CreateThread(NULL,0, (LPTHREAD_START_ROUTINE) THREAD_FUNCTION,(LPVOID)&d,0, NULL);
    //wait for it
    WaitForSingleObject(thread,INFINITE);
    CloseHandle(thread);
    printf("Main thread finish: Last error is %lu\n",GetLastError());
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这输出:

Main …
Run Code Online (Sandbox Code Playgroud)

c winapi multithreading

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

指针模板清除功能的向量无法使用"未定义的引用"消息进行编译

对于我的程序,我做了一个小函数来清除我所拥有的各种std ::指针向量.

template <class S>
void clearPtrVector(std::vector<S*> &a,int size)
{
    for(size_t i = 0; i < size; i++)
         delete a[i];

    a.clear();
}
Run Code Online (Sandbox Code Playgroud)

我必须在这里做错了,因为在析构函数中调用此函数是这样的:

clearPtrVector(neurons,neurons.size());
Run Code Online (Sandbox Code Playgroud)

我两次得到以下未定义的引用:

undefined reference to `void clearPtrVector<Neuron>(std::vector<Neuron*,std::allocator<Neuron*> >&, int)'
Run Code Online (Sandbox Code Playgroud)

我不得不承认我不熟悉std :: allocator是什么,所以我无法猜出这里可能出现的问题.任何帮助都非常感谢.提前致谢!

-Lefteris

c++ templates stl stdvector

0
推荐指数
1
解决办法
1710
查看次数