小编msi*_*msi的帖子

Java 1.6 - 确定符号链接

在DirectoryWalker类中,我想知道File实例是否实际上是指向目录的符号链接(假设,walker在UNIX系统上行走).鉴于,我已经知道实例是一个目录,以下是确定符号链接的可靠条件吗?

File file;
// ...      
if (file.getAbsolutePath().equals(file.getCanonicalPath())) {
    // real directory ---> do normal stuff      
}
else {
    // possible symbolic link ---> do link stuff
}
Run Code Online (Sandbox Code Playgroud)

java java-6

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

为什么这个程序崩溃:在DLL之间传递std :: string

我无法弄清楚以下崩溃的原因(MSVC9):

//// the following compiles to A.dll with release runtime linked dynamically
//A.h
class A {
  __declspec(dllexport) std::string getString();
};
//A.cpp
#include "A.h"
std::string A::getString() {
   return "I am a string.";
}

//// the following compiles to main.exe with debug runtime linked dynamically
#include "A.h"
int main() {
   A a;
   std::string s = a.getString();
   return 0;
} // crash on exit
Run Code Online (Sandbox Code Playgroud)

显然(?)这是由于可执行文件和DLL的不同内存模型.可能是字符串A::getString()返回是在A.dll中分配并在main.exe中释放?

如果是这样,为什么 - 以及在DLL(或可执行文件)之间传递字符串的安全方法是什么?不使用shared_ptr这样的包装器和自定义删除器.

c++ dll memory-management visual-c++

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

跨DLL的内存/堆管理

虽然它似乎是一个非常常见的问题,但我没有收集到太多信息:如何在DLL边界之间创建有关内存分配的安全接口?

众所周知

// in DLL a
DLLEXPORT MyObject* getObject() { return new MyObject(); }
// in DLL b 
MyObject *o = getObject();
delete o;
Run Code Online (Sandbox Code Playgroud)

肯定会导致崩溃.但是,由于像上面那样的交互 - 我敢说 - 并不罕见,因此必须有一种方法来确保安全的内存分配.

当然,人们可以提供

// in DLL a
DLLEXPORT void deleteObject(MyObject* o) { delete o; }
Run Code Online (Sandbox Code Playgroud)

但也许有更好的方法(例如smart_ptr?).我也读到了在处理STL容器时使用自定义分配器的问题.

所以我的调查更多的是关于处理这个主题的文章和/或文献的一般指示.是否存在需要注意的特殊谬误(异常处理?)并且这个问题仅限于DLL还是"受到"的UNIX共享对象?

c++ dll memory-management

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

功能参数的多态性

好的 - 这可能是一个非常愚蠢的问题,但它一直困扰着我.

有语言吗?

class Animal;
class Ape : public Animal
{...}

void doStuff(Animal* animalPtr)
{
    cout << "doing animal stuff" << endl;
}

void doStuff(Ape* apePtr)
{
    cout << "doing ape stuff" << endl;
}

Animal *ape = new Ape();
doStuff(ape);
Run Code Online (Sandbox Code Playgroud)

会屈服"doing ape stuff"吗?(请使用C++语法来支持我)为了澄清,我想要"一个接受参数的函数,并根据参数的类型对其进行操作".

它会有意义吗?当然,作为开发人员,您需要注意,因为看起来像Animal指针的实例实际上可能会调用Ape代码,因为在运行时它是指向的Ape实例.

c++ oop polymorphism language-design

11
推荐指数
2
解决办法
6018
查看次数

在改变c字符串时避免内存泄漏

出于教育目的,我在一些测试程序中使用cstrings.我想用占位符缩短字符串,例如"......".

也就是说,如果我的最大长度设置为13 ,"Quite a long string"则会变为"Quite a lo..."13.此外,我不想破坏原始字符串 - 因此缩短的字符串必须是副本.

下面的(静态)方法是我提出的.我的问题是:为类缩短的字符串分配内存的类是否也应该负责释放它? 我现在所做的是将返回的字符串存储在单独的"用户类"中,并将内存释放到该用户类.

const char* TextHelper::shortenWithPlaceholder(const char* text, size_t newSize) {
    char* shortened = new char[newSize+1];

    if (newSize <= 3) {
        strncpy_s(shortened, newSize+1, ".", newSize);
    }
    else {
        strncpy_s(shortened, newSize+1, text, newSize-3);
        strncat_s(shortened, newSize+1, "...", 3);  
    }
    return shortened;
}
Run Code Online (Sandbox Code Playgroud)

c++ connection-string memory-management cstring

3
推荐指数
2
解决办法
1305
查看次数

在 UNIX 进程之间交换中等大量数据的最佳方法是什么?

在 UNIX 进程之间交换中等大量数据(数兆字节,但不是千兆字节)的最佳方法是什么?

我认为,这将是内存映射文件,因为大小限制似乎足够可以忍受。

我需要双向通信,所以普通管道没有帮助。据我所知,套接字和 UDP 存在大小限制(另请参阅此处)。不确定 TCP 是否是在 . 的子进程和父进程之间进行通信的好主意fork()

阅读诸如此类的相关问题,有些人推荐了共享内存/ mmap,其他人推荐了套接字。

还有什么我应该调查的吗?例如,是否有一些更高级别的库可以通过提供数据的 XML 序列化/反序列化来帮助 IPC?

根据评论进行编辑:

在我的特殊情况下,有一个父/控制器进程和几个子进程(不能使用线程)。控制器根据要求向儿童提供一些可能适合一个 UDP 数据包的关键数据。孩子们对按键数据进行操作,并向控制器提供基于按键的信息(信息大小可以是10-100MB)。

问题:响应数据的大小、通知父级有关密钥请求的机制、同步 - 父级在传递给子级后必须从其列表中删除密钥,不应发生重复的密钥处理。

Boost 和其他第三方库(不幸的是)不得使用。我也许可以使用SunOS 5.10系统提供的库。

c c++ serialization ipc mmap

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

导出模板代码=危险?(MSVC)

正如我在另一个SO问题中所提到的,我遇到了这篇文章.当我通过MSVC7.1编译boost 1.40并弹出几个C4251警告时,问题出现了.

现在,在阅读完所述文章之后,我想知道:通常不鼓励导出模板代码,例如

class DLLEXPORT_MACRO AClass
{
public:
   std::vector<int> getVecCopy() { return myVec; }
   ...
}
Run Code Online (Sandbox Code Playgroud)

假设此代码通过MSVC7.1编译为DLL.虽然从其他MSVC7.1代码引用时此代码不会产生任何错误,但据说在MSVC8代码中引用此DLL会在运行时产生崩溃(内存对齐问题?).

因为这显然很糟糕......什么是应对导出模板代码问题的"最佳实践"?

c++ dll linker templates

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